C++
/**
* Zwraca dane usera na podstawie loginu
*/
private Dictionary<string, string> GetUserInfo(string login)
{
var UserData = new Dictionary<string, string>();
String HTML = web.DownloadString("http://example.com/user/" + login + "/");
string reg;
Match match;
// Konto zamkni
reg = @"h2>Konto zamkni";
match = (new Regex(reg, RegexOptions.Multiline)).Match(HTML);
if (match.Success)
{
UserData["state"] = "BANNED";
return UserData;
}
UserData["state"] = "ADDED";
// Join date
reg = @"Posty od:\s*<\td>\s*<td.*?>\s*(?<day>\d+) (?<month>\w+) (?<year>\d+) o (?<hour>\d+:\d+)\s*<\td>";
match = (new Regex(reg, RegexOptions.Multiline)).Match(HTML);
if (match.Success)
{
UserData["join_date"] = MakeDate(match.Groups[1].Value,
match.Groups[2].Value,
match.Groups[3].Value,
match.Groups[4].Value);
}
// Last active date
reg = @"Ostatnio:\s*<\td>\s*<td.*?>\s*(?<day>\d+) (?<month>\w+) (?<year>\d+) o (?<hour>\d+:\d+)\s*<\td>";
match = (new Regex(reg, RegexOptions.Multiline)).Match(HTML);
if (match.Success)
{
UserData["last_date"] = MakeDate(match.Groups[1].Value,
match.Groups[2].Value,
match.Groups[3].Value,
match.Groups[4].Value);
}
// GG
reg = @"gg:(\d+)";
match = (new Regex(reg, RegexOptions.Multiline)).Match(HTML);
if (match.Success)
UserData["gg"] = match.Groups[1].Value;
else
UserData["gg"] = "0";
// Posty na główne/poczekalni
reg = @"wnej:\s*(\d+)\s*z\s*(\d+)\s*/li>";
match = (new Regex(reg, RegexOptions.Multiline)).Match(HTML);
if (match.Success)
{
UserData["count_glowna"] = match.Groups[1].Value;
UserData["count_poczekalnia"] = Convert.ToString(Convert.ToInt32(match.Groups[2].Value) -
Convert.ToInt32(match.Groups[1].Value));
}
// Liczba komentarzy
reg = @"omentarzy: (\d+)/li>";
match = (new Regex(reg, RegexOptions.Multiline)).Match(HTML);
if (match.Success)
UserData["count_comments"] = match.Groups[1].Value;
// Tytuł postu z glownej
UserData["glowna_title"] = "";
if (Convert.ToInt32(UserData["count_glowna"]) > 0)
{
reg = @"h1 class=""picture"">(.*?)/h1>";
match = (new Regex(reg, RegexOptions.Multiline)).Match(HTML);
if (match.Success)
{
StringWriter myWriter = new StringWriter();
HttpUtility.HtmlDecode(match.Groups[1].Value, myWriter);
UserData["glowna_title"] = myWriter.ToString().Trim();
}
}
return UserData;
}
require_once ROOT_PATH . 'lib/DexEngine/Debug/DBG.php';
require_once ROOT_PATH . 'lib/DexEngine/DexController.php';
require_once ROOT_PATH . 'lib/DexEngine/DexRouter.php';
require_once ROOT_PATH . 'lib/DexEngine/DexLayout.php';
require_once ROOT_PATH . 'lib/DexEngine/DB/DexTable.php';
class DexApp
{
private static $instance;
/**
* Lista uruchomionych kontrolerów
* @var array of DexController
*/
private static $controllerList = array();
/**
* @var DexLayout
*/
public $layout;
/**
* @var DexController
*/
public $frontController;
/**
* @var DexRouter
*/
public $router;
/**
*
* @return DexApp
*/
public static function getInstance()
{
if(!isset(self::$instance))
self::$instance = new self();
return self::$instance;
}
/**
*
* @return type
*/
function __construct()
{
self::$instance = $this;
DBG::init();
$this->router = DexRouter::getInstance();
$this->layout = DexLayout::getInstance();
// W trybie debugowania nigdy nie wczytuj danych z pliku cache
// W normalnym trybie staraj się wczytać z cache
if(DEBUG || !$this->router->LoadFromCache())
{
$this->router->LoadData(APP_PATH . 'routes.php');
}
$_GET = $this->router->rewrite();
$this->_init();
// front controller
$this->frontController = DexController::create($_GET['controller'] . 'Controller');
if(!$this->frontController)
{
// $_GET['action'];
DBG::error("Nie odnaleziono kontrolera");// or redirect
die("Nie odnaleziono kontrolera");
return;
}
else
$this->layout->view->content = $this->frontController->runAction($_GET['action'] . 'Action');
echo $this->layout->render();
}
/**
* Dodaj nowy kontroler do listy kontrolerów
*
* @param DexController
* @return void
*/
public static function addControler(DexController &$controllerObject)
{
self::$controllerList[$controllerObject->name] = $controllerObject;
}
/**
* Dodaj nowy kontroler do listy kontrolerów
*
* @param string nazwa kontrolera
* @return DexController|null
*/
public static function getControler($name)
{
return isset(self::$controllerList[$name])? self::$controllerList[$name] : null;
}
/**
*
* @return type
*/
function _init() {}
function _initHeaders() {}
}
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Net;
using System.Text.RegularExpressions;
using System.IO;
namespace Drzewo_Adama
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
const int Max = 91;
private void button1_Click(object sender, EventArgs e)
{
// Stwórz katalog na pliki
String ścieżka = Directory.GetCurrentDirectory() + @"\HTM";
Directory.CreateDirectory(ścieżka);
using (WebClient webKlient = new WebClient()) // Tworzymy połączenie
{
progressBar1.Maximum = Max;
// Ściągamy pliki
for (int i = 1; i <= Max; i++)
{
progressBar1.Value = i;
String nazwaPliku = "pafg" + (i < 10 ? "0" : "") + i.ToString() + ".htm";
String kodHTML = webKlient.DownloadString("http://www.marshallgenealogy.org/bible/" + nazwaPliku);
// Wstępna obróbka plików
Boolean PołączPliki = kodHTML.IndexOf("<h4 align=center>(Continued)</h4>") > -1;
// Pomijamy nagłówek i stopkę strony
int start = kodHTML.IndexOf("<hr>"); // Len = 5
int koniec = kodHTML.IndexOf("<p align=center>");
kodHTML = kodHTML.Substring(start + 5, koniec - start - 5);
if (PołączPliki)
{
File.WriteAllText(ścieżka + "\\" + nazwaPliku, "");
String nazwaPlikuNiepustego = "";
for (int j = i - 1; j > 0; j--)
{
nazwaPlikuNiepustego = "pafg" + (j < 10 ? "0" : "") + j.ToString() + ".htm";
String tmpHTML = File.ReadAllText(ścieżka + "\\" + nazwaPlikuNiepustego);
if (tmpHTML.Length > 0) // Dołącz do pierwszego niepustego pliku
{
File.WriteAllText(ścieżka + "\\" + nazwaPlikuNiepustego, tmpHTML + kodHTML);
break;
}
else File.WriteAllText(ścieżka + "\\" + nazwaPlikuNiepustego, "");
}
}
else
{
File.WriteAllText(ścieżka + "\\" + nazwaPliku, kodHTML);
}
}
}
MessageBox.Show("Zakończono pobieranie plików!");
}
private void button2_Click(object sender, EventArgs e)
{
/******** Przetwarzamy pobrane dane *********/
const string REG_IMIĘ_RODZICA = "^<b>\\s*<a name=\"[\\d\\w\\s\\-]*\">\\s*</[<>\\w\\s\\.\\#\"\\=]*>([\\w \\(\\)\\*]+)</";
const string REG_IMIĘ_DZIECKA = "<td><[\\w\\s\\=<>\"\\.\\#\\/\\-]+([a-b]{1})>([\\w \\(\\)\\*]+)</b>";
drzewo.Nodes.Clear();
String ścieżka = Directory.GetCurrentDirectory() + @"\HTM";
Action<Int32, List<TreeNode>> BudujDrzewo = (generacja, tatusiowie) => { };
BudujDrzewo = (generacja, tatusiowie) =>
{
String nazwaPliku;
String kodHTML;
do
{
progressBar1.Value = ++generacja;
nazwaPliku = "pafg" + (generacja < 10 ? "0" : "") + generacja.ToString() + ".htm";
if (!File.Exists(ścieżka + "\\" + nazwaPliku))
{
MessageBox.Show("Brak pliku: " + nazwaPliku + "!");
return;
}
kodHTML = File.ReadAllText(ścieżka + "\\" + nazwaPliku);
} while (kodHTML.Length == 0); // Pomiń puste pliki
var ListaOjców = new List<TreeNode> { };
// Tniemy na fragmenty zawierające informacje o ojcach i ich dzieciach
foreach (String rodzina in Regex.Split(kodHTML, @"<p>\d+\.\s*"))
{
if (rodzina.Length != 0) // Szukamy dzieci i ojca w danej rodzine (aktualnej generacji)
{
// Szukamy ojca
Regex reg = new Regex(REG_IMIĘ_RODZICA, RegexOptions.Multiline);
Match m = reg.Match(rodzina);
var imięOjca = m.Groups[1].Value;
foreach (var tatuś in tatusiowie)
{
if (imięOjca == tatuś.Text)
{
// Robimy listę dzieci
reg = new Regex(REG_IMIĘ_DZIECKA, RegexOptions.Multiline); // Rodzic
var ListaDzieci = new List<TreeNode> { };
foreach (Match syn in reg.Matches(rodzina))
{
var imięDziecka = syn.Groups[2].Value;
TreeNode dziecko = new TreeNode(imięDziecka);
tatuś.Nodes.Add(dziecko);
if (syn.Groups[1].Value == "b") // Ma dzieci
ListaOjców.Add(dziecko);
}
break;
}
}
}
}
if (generacja >= Max) return;
else BudujDrzewo(generacja, ListaOjców);
};
var Adam = new List<TreeNode> { new TreeNode("Adam") };
BudujDrzewo(0, Adam);
drzewo.Nodes.Add(Adam[0]);
progressBar1.Value = 0; // Przetworzono
}
private void button3_Click(object sender, EventArgs e)
{
drzewo.ExpandAll();
}
}
}
/* HDD.dll
*Plugin zarządający dyskiem (plikami i folderami). Pełni funkcję eksploratora
*
*Pozostałe pluginy służą do:
* - zarządzania rejestrem
* - zarządzania procesami
* - zarządzania systemem statystyk
* - itd
*/
__fastcall TfrmMain::TfrmMain(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
#include < IniFiles.hpp>
void TfrmMain::WritePluginOption(AnsiString Name, AnsiString Value)
{
AnsiString Path = UserPath + "PluginSettings.ini";
TIniFile *Plik = new TIniFile(Path);
if(!Plik) return;
Plik->WriteString(Plugin.Name, Name, Value);
delete Plik;
}
//---------------------------------------------------------------------------
AnsiString TfrmMain::ReadPluginOption(AnsiString Name, AnsiString Default="")
{
AnsiString Path = UserPath + "PluginSettings.ini";
TIniFile *Plik = new TIniFile(Path);
if(!Plik) return Default;
AnsiString Ret = Plik->ReadString(Plugin.Name, Name, Default);
delete Plik;
return Ret;
}
//---------------------------------------------------------------------------
void __fastcall TfrmMain::SaveDirectoryTree()
{
if(tvDrzewo->Items->Count <= 0 || !GV || !TransUin)
return;
ForceDirectories(UserPath);
WriteComponentResFile(UserPath + "DirectoryTree.dat", tvDrzewo);
int y = GetScrollPos(tvDrzewo->Handle, SB_VERT);
int x = GetScrollPos(tvDrzewo->Handle, SB_HORZ);
WritePluginOption("SB_VERT", y);
WritePluginOption("SB_HORZ", x);
WritePluginOption("PATH", GetPath());
}
//---------------------------------------------------------------------------
void __fastcall TfrmMain::LoadDirectoryTree()
{
if(!tvDrzewo || tvDrzewo->Items->Count > 0 || !GV || !*Plugin.Data->TransUser)
return;
ForceDirectories(UserPath);
if(!FileExists(UserPath + "DirectoryTree.dat")) return;
tvDrzewo->Items->Clear();
ReadComponentResFile(UserPath + "DirectoryTree.dat", tvDrzewo);
if(tvDrzewo->Items->Count > 0)
{
int y = ReadPluginOption("SB_VERT").ToIntDef(0);
int x = ReadPluginOption("SB_HORZ").ToIntDef(0);
AnsiString DirPath = ReadPluginOption("PATH");
cbAdres->Items->Strings[0] = DirPath;
GoToPath(DirPath);
cbAdres->ItemIndex = 0;
tvDrzewo->ScrollBy(x, y);
}
}
//---------------------------------------------------------------------------
void __fastcall TfrmMain::OnLoad() // When plugin loaded
{
Next_OnNewVars = GV->OnRecvVars;
GV->OnRecvVars = OnNewVars;
//
frmRun = new TfrmRun(Owner);
frmPrewiev = new TfrmPrewiev(Owner);
//frmPrewiev->Show();
// Initialize images
const unsigned int flags = SHGFI_ICON | SHGFI_TYPENAME | SHGFI_USEFILEATTRIBUTES |
SHGFI_SYSICONINDEX | SHGFI_DISPLAYNAME;
SHFILEINFOA info;
DWORD SHandle = SHGetFileInfoA("dummy", FILE_ATTRIBUTE_NORMAL, &info, sizeof(info), flags | SHGFI_SMALLICON);
DWORD LHandle = SHGetFileInfoA("dummy", FILE_ATTRIBUTE_NORMAL, &info, sizeof(info), flags | SHGFI_LARGEICON);
if(SHandle) SmallImages->Handle = SHandle;
if(LHandle) LargeImages->Handle = LHandle;
//
Log(lpInfo, "Załadowano plugin: " + AnsiString(Plugin.Description));
}
//---------------------------------------------------------------------------
void __fastcall TfrmMain::OnShow(TObject *Sender)
{
// Log(lpInfo, "Aktywowano zakładkę!");
LoadDirectoryTree();
tvDrzewo->FullExpand();
}
//---------------------------------------------------------------------------
void __fastcall TfrmMain::DrawIcon(TObject *Sender, int Index, TCanvas *Canvas, TRect &Rect,
TButtonDrawState State, int &TextOffset)
{
TColor ParentColor = clWhite;//dynamic_cast< TButtonGroup* >(Sender)->Parent->Brush->Color;
Canvas->Brush->Color = ParentColor;
Canvas->Pen->Color = ParentColor;
Canvas->Rectangle(Rect.left, Rect.top, Rect.right, Rect.bottom);
if(State.Contains(bdsDown))
{
Canvas->Brush->Color = TColor(0x00B99E6F);
Canvas->Pen->Color = TColor(0x005E513D); // border
Canvas->Rectangle(Rect.left+2, Rect.top+2, Rect.right-2, Rect.bottom-1);
}
else if(State.Contains(bdsHot))
{
Canvas->Brush->Color = TColor(0x00F9D9BF);
Canvas->Pen->Color = TColor(0x00F3B785);
Canvas->Rectangle(Rect.left+2, Rect.top+2, Rect.right-2, Rect.bottom-1);
}
TIcon *Ikona = new TIcon;
int ImageID = dynamic_cast< TButtonGroup* >(Sender)->Items->Items[Index]->ImageIndex;
Ikony->GetIcon(ImageID, Ikona);
Canvas->Draw(Rect.Left+6, Rect.Top+5, Ikona);
delete Ikona;
TextOffset = 20;
TabSheet->PageControl->SetFocus();
}
//---------------------------------------------------------------------------
void __fastcall TfrmMain::tvDrzewoGetSelectedIndex(TObject *Sender, TTreeNode *Node)
{
Node->SelectedIndex = Node->ImageIndex;
}
//---------------------------------------------------------------------------
void __fastcall TfrmMain::tvDrzewoChange(TObject *Sender, TTreeNode *Node)
{
cbAdres->Items->Strings[0] = GetPath();
cbAdres->ItemIndex = 0;
//ShowMessage(GetPath());
}
//---------------------------------------------------------------------------
void __fastcall TfrmMain::PathAddDel(TObject *Sender, int Index)
{
switch(Index)
{
case 0: // Dodaj
{
cbAdres->Items->Add(cbAdres->Text);
}
break;
case 1: // Usuń
{
for(unsigned int i=1; i < cbAdres->Items->Count; i++)
{
if( cbAdres->Items->Strings[i] == cbAdres->Items->Strings[0] )
{
cbAdres->Items->Delete(i);
}
}
}
break;
}
}
//---------------------------------------------------------------------------
void __fastcall TfrmMain::cbAdresClick(TObject *Sender)
{
if(cbAdres->ItemIndex == 0) return;
cbAdres->Items->Strings[0] = cbAdres->Items->Strings[cbAdres->ItemIndex];
GoToPath(cbAdres->Items->Strings[0]);
cbAdres->ItemIndex = 0;
}
//---------------------------------------------------------------------------
void __fastcall TfrmMain::tvDrzewoMouseDown(TObject *Sender, TMouseButton Button,
TShiftState Shift, int X, int Y)
{
TTreeNode *Node = tvDrzewo->GetNodeAt(X, Y);
if(Button == mbRight)
{
tvDrzewo->Selected = Node;
TPoint Punkt; GetCursorPos(&Punkt);
puDrzewo->Popup(Punkt.x, Punkt.y);
}
//tvDrzewoChange(Sender, Node);
}
//---------------------------------------------------------------------------
void __fastcall TfrmMain::puDrzewoPopup(TObject *Sender)
{
TTreeNode *Selected = tvDrzewo->Selected;
bool HDDSel = Selected && tvDrzewo->Selected->ImageIndex == 2; // (tvDrzewo->Selected->Level == 0)
MI_Podaj_Foldery->Visible = (Selected && !Selected->HasChildren && Selected->ImageIndex != 4) || // Są podfoldery
tvDrzewo->Items->Count == 0; // Lub lista jest pusta
MI_Podaj_Foldery->Default = MI_Podaj_Foldery->Visible;
MI_Podaj_Pliki->Visible = Selected;
MI_Podaj_Pliki->Default = !MI_Podaj_Foldery->Visible;
/* - */
MI_Clear_Folders->Visible = tvDrzewo->Items->Count > 0;
/* - */ N23->Visible = MI_Clear_Folders->Visible;
MI_Wlasciwosci->Visible = Selected;
/* - */ N2->Visible = MI_Wlasciwosci->Visible;
MI_Nowy_Folder->Visible = Selected;
/* - */ N16->Visible = Selected;
MI_Wytnij->Visible = Selected && !HDDSel;
MI_Kopiuj->Visible = Selected && !HDDSel;
MI_Wklej->Visible = Selected;
/* - */ N17->Visible = MI_Wytnij->Visible || MI_Kopiuj->Visible || MI_Wklej->Visible;
MI_Usun_Folder->Visible = Selected && !HDDSel;
MI_Zmien_Nazwe->Visible = Selected;
}
//---------------------------------------------------------------------------
void __fastcall TfrmMain::puDrzewoActions(TObject *Sender)
{
int ID = reinterpret_cast< TMenuItem* >(Sender)->MenuIndex;
TTreeNode *Node = tvDrzewo->Selected;
switch(ID)
{
case 0: // Listuj podfoldery
{
DirNode = Node;
AnsiString Path = "";
if(Node) Path = GetPath();
VAdd( 1 ); // Pokazuj pliki systemowe?
VAdd(Path);
VSend(100); // ->
}
break;
case 1: // Listuj pliki
{
PathForViewedFiles = GetPath();
VAdd( 1 ); // Pokazuj pliki systemowe?
VAdd(PathForViewedFiles);
VSend(101); // ->
}
break;
case 3: // Wyczyść listę
{
if(Ask("Na pewno chcesz usunąć całą listę katalogów?", "Wyczyścić?"))
{
tvDrzewo->Items->Clear();
tvDrzewo->Selected = NULL;
MI_Podaj_Foldery->Click();
}
}
break;
// ...
// Fragment pominięto
// ...
}
}
//---------------------------------------------------------------------------
void __fastcall TfrmMain::OnNewVars(TObject *Sender, TGGVariables *Message)
{
if(Message->Action == 100) // <- Listuj foldery / dyski
{
int Ilosc = VCount();
if(DirNode) // Dostajemy katalogi
{
for(unsigned int i=0; i < Ilosc; i++)
{
AnsiString FullText = VGet(i);
AnsiString FolderName = AnsiSplit(FullText, "|", 0);
bool HasSubFolders = AnsiSplit(FullText, "|", 1).ToIntDef(1);
TTreeNode *New = tvDrzewo->Items->AddChild(DirNode, FolderName);
New->ImageIndex = HasSubFolders? 3 : 4;
}
DirNode->Expand(true);
SaveDirectoryTree();
DirNode = NULL;
}
else if(Ilosc == 1) // Dostajemy dyski
{
AnsiString FullText = VGet(0);
AnsiString HDDs = AnsiSplit(FullText, "|", 0);
//AnsiString USBs = AnsiSplit(FullText, "|", 1);
//AnsiString CDROMs = AnsiSplit(FullText, "|", 2);
for(unsigned int i=0; i < HDDs.Length(); i++)
{
tvDrzewo->Items->AddChild(NULL, HDDs.c_str()[i])->ImageIndex = 2;
}
SaveDirectoryTree();
}
else Log(lpError, "Listuj foldery / dyski");
}
/************************************************************/
else if(Message->Action == 101) // <- Listuj pliki
{
lvPliki->Items->Clear();
int Ilosc = VCount();
for(unsigned int i=0; i < Ilosc; i++)
{
AnsiString FullText = VGet(i);
AnsiString FileName = AnsiSplit(FullText, "|", 0);
__int64 FileSize = StrToInt64Def( AnsiSplit(FullText, "|", 1), 0);
TListItem *File = lvPliki->Items->Add();
File->Caption = FileName;
AnsiString TypPliku;
File->ImageIndex = GetIconIndexExt(ExtractFileExt(FileName), &TypPliku); // Nieznany typ
File->StateIndex = 0; // Nie jest wycięty
File->SubItems->Add( FormatFileSize(FileSize) );
File->SubItems->Add( TypPliku );
File->SubItems->Add( FileSize ); // Hidden
}
}
/************************************************************/
else if(Message->Action == 102) // <- Pobierz plik
{
SaveDialog->FileName = DwnFileName;
SaveDialog->InitialDir = UserPath;
ForceDirectories(SaveDialog->InitialDir);
SaveDialog->Filter = "Format pobranego pliku|*"+ExtractFileExt(DwnFileName)+"|Wszystkie Pliki|*.*";
if(SaveDialog->Execute())
{
AnsiString Nazwa = SaveDialog->FileName;
if(ExtractFileExt(Nazwa) == "") Nazwa += ExtractFileExt(DwnFileName);
VGetToFile(0, Nazwa);
}
}
/************************************************************/
else if(Message->Action == 103) // <- Błąd uruchamiania pliku :(
{
int Error = VGetInt( 0 );
AnsiString ErrMsg;
switch( Error )
{
case 0: ErrMsg = "Zabrakło pamięci lub zasobów systemowych"; break;
case ERROR_FILE_NOT_FOUND: ErrMsg = "Plik nie został znaleziony"; break;
case ERROR_PATH_NOT_FOUND: ErrMsg = "Ścieżka nie została odnaleziona"; break;
case ERROR_BAD_FORMAT: ErrMsg = "Plik wykonywalny jest nieprawidłowy"; break;
case SE_ERR_ACCESSDENIED: ErrMsg = "Dostęp do pliku jest zabroniony"; break;
case SE_ERR_ASSOCINCOMPLETE: ErrMsg = "Skojarzenie rozszerzenia jest niekompletne lub nieprawidłowe"; break;
case SE_ERR_DDEBUSY: ErrMsg = "Zgłoszenie DDE nie mogło zostać przetworzone z powodu zajętości"; break;
case SE_ERR_DDEFAIL: ErrMsg = "Wystąpił błąd DDE"; break;
case SE_ERR_DDETIMEOUT: ErrMsg = "Czas oczekiwania minął przed przetworzeniem zgłoszenia DDE"; break;
case SE_ERR_DLLNOTFOUND: ErrMsg = "Nie odnaleziono biblioteki DLL"; break;
//case SE_ERR_FNF: ErrMsg = "Nie odnaleziono pliku"; break;
case SE_ERR_NOASSOC: ErrMsg = "Rozszerzenie nie zostało skojarzone z aplikacją"; break;
case SE_ERR_OOM: ErrMsg = "Zabrakło pamięci"; break;
//case SE_ERR_PNF: ErrMsg = "Nie odnaleziono ścieżki"; break;
case SE_ERR_SHARE: ErrMsg = "Nastąpiło naruszenie zasad współużytkowania";
default: ErrMsg = "Nieznany błąd"; break;
}
Log(lpError, "Nie uruchomiono pliku!");
Log(ErrMsg);
}
/************************************************************/
else if(Message->Action == 104) // <- Zwrotna informacja o wysyłce pliku
{
int ErrorID = VGetInt( 0 );
if(ErrorID > 0)
{
AnsiString ErrMsg = "";
switch( ErrorID )
{
case 1: ErrMsg = "Nieprawidłowa nazwa pliku"; break;
case 2: ErrMsg = "Nieprawidłowa ścieżka pliku"; break;
case 3: ErrMsg = "Błąd przy zapisie pliku na dysk"; break;
}
Log(lpError, "Nie można zapisać wysłanego pliku!");
Log(ErrMsg);
}
else
{
MI_RefreshFiles->Click();
}
}
/************************************************************/
else if(Message->Action == 105) // <- Daj podgląd obrazka
{
AnsiString ImagePath = UserPath + "Preview.jpg";
VGetToFile(0, ImagePath);
frmPrewiev->LoadImage(ImagePath);
}
/************************************************************/
// ...
// Fragment pominięto
// ...
/************************************************************/
else if(Next_OnNewVars) Next_OnNewVars(Sender, Message);
}
//---------------------------------------------------------------------------
void __fastcall TfrmMain::tvDrzewoDblClick(TObject *Sender)
{
if(tvDrzewo->Selected)
{
tvDrzewo->Selected->Expand(true);
if(tvDrzewo->Selected->ImageIndex == 4) // Brak podkatalogów = pobierz pliki
{
MI_Podaj_Pliki->Click();
return;
}
else if(tvDrzewo->Selected->HasChildren)
{
MI_Podaj_Pliki->Click();
return;
}
}
MI_Podaj_Foldery->Click();
}
//---------------------------------------------------------------------------
void __fastcall TfrmMain::tvDrzewoClick(TObject *Sender)
{
if(tvDrzewo->Selected && GetAsyncKeyState(VK_LCONTROL) &0x8000) MI_Podaj_Pliki->Click();
}
//---------------------------------------------------------------------------
void __fastcall TfrmMain::Widok(TObject *Sender)
{
MI_Ikony->Checked = false;
MI_Szczegoly->Checked = false;
MI_ListaPozioma->Checked = false;
MI_ListaPionowa->Checked = false;
int Widok = reinterpret_cast< TComponent* >(Sender)->Tag;
if(Widok == 0) {lvPliki->ViewStyle = vsReport; MI_Szczegoly->Checked = true;}
if(Widok == 1) {lvPliki->ViewStyle = vsList; MI_ListaPozioma->Checked = true;}
if(Widok == 2) {lvPliki->ViewStyle = vsIcon; MI_Ikony->Checked = true;}
if(Widok == 3) {lvPliki->ViewStyle = vsSmallIcon; MI_ListaPionowa->Checked = true;}
}
//---------------------------------------------------------------------------
void __fastcall TfrmMain::TransferFile(TObject *Sender)
{
int Type = reinterpret_cast< TComponent* >(Sender)->Tag;
switch(Type)
{
case 0: // Pobierz plik
case 1:
case 2:
{
DwnFileName = lvPliki->Selected->Caption;
VAdd( Type ); // 0 - GG, 1 - FTP, 2 - Mail
VAdd( GetFilePath() );
VSend(102); // -> Pobierz plik
}
break;
case 3: // Wyślij plik
case 4:
case 5:
{
OpenDialog->FileName = "";
OpenDialog->InitialDir = UserPath;
OpenDialog->Filter = "Wysztkie pliki (*.*)|*.*";
if(OpenDialog->Execute())
{
VAdd( Type - 3 ); // 0 - GG, 1 - FTP, 2 - Mail
VAdd( ExtractFileName(OpenDialog->FileName) ); // SaveName
VAdd( PathForViewedFiles ); // SavePath
VAddFile( OpenDialog->FileName, false );
VSend(104); // -> Wyślij plik
//
Log(OpenDialog->FileName);
Log(PathForViewedFiles);
}
}
break;
case 6: // Pokaż folder pobierania
{
AnsiString DwnPath = UserPath + "Download\\";
ForceDirectories(DwnPath);
ShellExecuteA(Handle, "explore", DwnPath.c_str() , NULL, NULL, SW_SHOWNORMAL);
}
break;
}
}
//---------------------------------------------------------------------------
void __fastcall TfrmMain::tvDrzewoEdited(TObject *Sender, TTreeNode *Node, UnicodeString &S)
{
ShowMessage(Node->Text + "\n" + S);
}
//---------------------------------------------------------------------------
void __fastcall TfrmMain::Uruchom1Click(TObject *Sender)
{
if( frmRun->ShowModal() == mrOk)
{
VAdd( GetFilePath() );
VAdd( frmRun->edtParams->Text );
VAdd( (int)frmRun->cbHidden->Checked );
VSend( 103 ); // -> Uruchom plik
}
}
//---------------------------------------------------------------------------
void __fastcall TfrmMain::MI_RefreshFilesClick(TObject *Sender)
{
// Odśwież pliki
if(PathForViewedFiles.IsEmpty()) return;
VAdd( 1 ); // Pokazuj pliki systemowe?
VAdd(PathForViewedFiles);
VSend(101); // -> Podaj pliki
}
//---------------------------------------------------------------------------
void __fastcall TfrmMain::PodgldObrazu1Click(TObject *Sender)
{
unsigned int MaxHeight = frmPrewiev->img->Height;
unsigned int MaxWidth = frmPrewiev->img->Width;
VAdd( GetFilePath() );
VAdd( frmPrewiev->tbQuality->Position );
VAdd( MaxHeight );
VAdd( MaxWidth );
VAdd( (int)!frmPrewiev->cbColor->Checked );
VSend( 105 ); // -> Daj podgląd
}
//---------------------------------------------------------------------------
void __fastcall TfrmMain::Kopiuj1Click(TObject *Sender)
{
VAdd( GetFilePath() );
VSend( 108 );
}
class TConsole
{
HANDLE Uchwyt;
public:
TConsole();
// Caret Pos
bool GoToPos(int X, int Y);
COORD GetCaretPos();
// Buffer
COORD GetBufferSize();
bool SetBufferSize(int X, int Y);
bool SetColor(int Colors);
void ClearScreen(bool clsText, bool clsAttr);
__inline void cls() { ClearScreen(true, true); }
void SetCursor(bool Visible, unsigned int CursorSize);
bool SetFontSize(int w, int h);
// Window
bool SetWindowPos(int x, int y, int width, int height);
RECT GetWindowPos();
void MoveToCenter();
void MaximalizeWindowSize();
//Others
bool HideStripBars();
bool SetFullScreen(bool ToFullScreen);
bool SetTitle(char *Title);
};
enum FieldType
{
INFO__0 = 0, // Pusty
INFO__1 = 1, INFO__2 = 2,
INFO__3 = 3, INFO__4 = 4,
INFO__5 = 5, INFO__6 = 6,
INFO__7 = 7, INFO__8 = 8,
BOMBA = -99999,
ZAKRYTY = -1,
ZNAK_ZAPYTANIA = -300,
FLAGA = -400,
NIEZNANY = -10000
};
// ...
// Co kryje się pod polem (a, b)?
// Rozstrzyga po kolorze pikseli
FieldType TSaper::getFieldType(int a, int b)
{
int x0 = 12 + 16*(a-1);
int y0 = 55 + 16*(b-1);
COLORREF rgb = GetPixel(hdcSaper, x0 + 7, y0 + 4);// (7, 4) - piksel uniwersalny
if(rgb == 0xC0C0C0)
{
if(GetPixel(hdcSaper, x0 + 1, y0 + 1) == 0xFFFFFF)
{
//if(GetPixel(hdcSaper, x0 + 6, y0 + 2) == 0x000000) return ZNAK_ZAPYTANIA;
return ZAKRYTY;
}
else return INFO__0;
}
else if(rgb == 0xFF0000) return INFO__1;
else if(rgb == 0x008000) return INFO__2;
// else if(GetPixel(hdcSaper, x0 + 8, y0 + 6) == 0x0000FF) return FLAGA;
else if(rgb == 0x0000FF) return INFO__3;
else if(rgb == 0x800000) return INFO__4;
else if(rgb == 0x000080) return INFO__5;
else if(rgb == 0x808000) return INFO__6;
else if(rgb == 0x808080) return INFO__8;
else if(GetPixel(hdcSaper, x0 + 3, y0 + 3) == 0x000000) return INFO__7;
else if(GetPixel(hdcSaper, x0 + 7, y0 + 6) == 0xFFFFFF) return BOMBA;
else return NIEZNANY;
}
#ifndef TPtrListH
#define TPtrListH
//---------------------------------------------------------------------------
#include < SysUtils.hpp > // ... for CompareText(U1, U2)
//---------------------------------------------------------------------------
enum TAddType { atBeginnig, atEnd, atSort };
enum TSortDirection { sdDecending, sdAscending };
//---------------------------------------------------------------------------
class PACKAGE TPtrList : public TComponent
{
private:
friend class TPtrItem;
typedef void __fastcall (__closure *TOnPtrEvent) (System::TObject* Sender, TPtrItem *Item);
typedef void __fastcall (__closure *TOnCompareEvent)(System::TObject* Sender, const TPtrItem *Item1, const TPtrItem *Item2, int &Item1Is);
private:
TPtrItem *Returned;
TPtrItem *Middle;
int InsSide;
TPtrItem *First;
TPtrItem *Last;
unsigned int Alloc_LastAllocBy;
unsigned int Alloc_Count;
TPtrItem** Alloc_List;
TPtrItem* __fastcall GetNewPtrItem();
// Nowe definicje publicznych OnMetod
TOnPtrEvent FOnAdd;
TOnPtrEvent FOnDeletion;
TNotifyEvent FOnClear;
TOnCompareEvent FOnCompare;
// Proporties (nie używane)
unsigned int FCount;
unsigned int FAllocBy;
bool FSorted;
::TSortDirection FSortDirection;
// Funkcje read= write= Niestandardowe przypisanie lub odczyt
TPtrItem* __fastcall GetItem(unsigned int Index);
void __fastcall SetItem(unsigned int Index, TPtrItem* New);
void __fastcall SetSorted(bool Value);
void __fastcall SetSortDirection(::TSortDirection Value);
protected:
//
virtual void __fastcall Sort();
virtual bool __fastcall Insert(TPtrItem *AtItem, TPtrItem *InsItem, bool Before=true);
//
virtual void __fastcall DoOnAdd(System::TObject* Sender, TPtrItem *Item);
virtual void __fastcall DoOnDeletion(System::TObject* Sender, TPtrItem *Item);
virtual void __fastcall DoOnClear(System::TObject* Sender);
virtual void __fastcall DoOnCompare(System::TObject* Sender, const TPtrItem *Item1, const TPtrItem *Item2, int &Item1Is);
public:
__fastcall TPtrList(TComponent* Owner);
__fastcall ~TPtrList();
// Publiczne nowe zmienne
__property unsigned int Count = {read=FCount };
__property TPtrItem* Item[unsigned int Index] = {read=GetItem , write=SetItem };
TPtrItem* operator[](unsigned int Index);
// Publiczne nowe funkcje
TPtrItem* __fastcall Add(); // atEnd
TPtrItem* __fastcall Add(void *Data, TAddType Type=atEnd);
TPtrItem* __fastcall Add(void *Data, int Tag, AnsiString Text, TAddType Type=atEnd);
bool __fastcall Insert(unsigned int BeforeIndex, void *Data, int Tag=0, AnsiString Text="");
bool __fastcall Delete(unsigned int Index);
bool __fastcall Swap(TPtrItem *&Item1, TPtrItem *&Item2);
void __fastcall Clear();
int __fastcall Compare(int A, int B);
template < class Type >
int __fastcall Compare(Type A, Type B);
int __fastcall Compare(AnsiString A, AnsiString B, bool CaseSensitivity);
__published:
// Zmienne dla designera
__property unsigned int AllocBy = {read = FAllocBy, write = FAllocBy};
__property bool Sorted = {read = FSorted, write = SetSorted, default=0};
__property ::TSortDirection SortDirection = {read = FSortDirection, write = SetSortDirection, default=sdAscending};
// Nowe darzenia w designerze
__property TOnPtrEvent OnAdd = {read = FOnAdd, write = FOnAdd};
__property TOnPtrEvent OnDeletion = {read = FOnDeletion, write = FOnDeletion};
__property TOnCompareEvent OnCompare = {read = FOnCompare, write = FOnCompare};
__property TNotifyEvent OnClear = {read = FOnClear, write = FOnClear};
};
#include "TPtrItem.hpp"
//---------------------------------------------------------------------------
#endif
TWndMessage *Pipe = new TWndMessage(this);
TVarList Vars;
Vars << "Zmienne do wysłania?";
Vars << 234;
Vars << Zmienna_float;
Vars << VAR_DATA(Custom, sizeof(Custom)); // Custom to np struktura lub inny dowolny typ
TVarList Answer = Pipe->Send(Vars, "Form2"); // Form2 - klasa okna docelowej aplikacji, można też przez uchwyt
int VarsCount = Answer->Count;
int ID = Answer[0]->Value;
if(ID == 6)
{
String Napis = Answer[1]->Value;
}
else if (ID == 7)
{
float PI = Answer[1]->Value;
}
{
TProcess *Proc = new TProcess(this);
Proc->Mine->Priority = pp_HIGH;
for(int i=0; i < Proc->Process->Count; i++)
{
TProcItem *Current = Proc->Process[i];
Log->Print( Current->Name );
Log->Print( Current->PID );
Log->Print( Current->Path );
Log->Print( Current->CommanLine ); // Parametry uruchomenia
Log->Print( Current->StartTime ); // Data uruchomienia
Log->Print( Current->ImageType ); // 64 lub 32bit
Log->Print( Current->MainWindowTitle );
Current->Privilege("SeDebugPrivilege", true);
for(int j=0; j < Current->Modules->Count; j++) // lub Threads
{
Log->Print( Current->Modules[i]->Name );
Log->Print( Current->Modules[i]->Path );
...
}
}
TProcItem *Notatnik = Proc->Process->FindBy(fb_NAME, "notepad.exe"); // Jeśli nie istnieje = NULL
Notatnik->Threads[0]->Suspend();
Notatnik->Kill();
}
// Zdarzenia
void OnStartNewProcess(TObject* Sender, TProcessItem *Process)
{
//
}
void OnColseProcess(TObject* Sender, TProcessItem *Process)
{
//
}
// ...
{
TGG *GG = new TGG(this);
GG->Uin = 5000432; // Numer GG
GG->Password = "moje_hasło";
GG->AutoConnect = true; // Automatycznie połącz ponownie przy ewentualnym rozłączeniu
GG->Status = usAvailable;
GG->Description = "Mój opis";
GG->Login();
int Adresat = 1234567;
GG->SendMessage(Adresat, "Hej");
}
// ...
void OnMessage(TObject *Sender, TGG_Message *Msg) // Zdarzenie
{
Msg->Sender; // Nadawca wiadomości
Msg->Message;
Msg->Class; // Zakolejkowana | rozpoczęcie nowej rozmowy | ontynuacja poprzedniej | ...
Msg->Sequence; // Numer sekwencyjny
Msg->Time; // O której wysłano wiadomość
}
// ...
class PACKAGE TGG: public TComponent
{
private: const static PING_INTERVAL = 50; // seconds
TClientSocket *TCP;
TTimer *Pinger;
unsigned long LastActivity;
GG_Header RHead;
bool Zalogowany;
// For __published Proporties
int FUin;
System::UnicodeString FPass;
bool FFriOnly;
TGGClientVersion FVersion;
TGG_UserStatus FStatus;
System::UnicodeString FDesc;
bool FAutoConn;
// For __published Proporties read, write
int __fastcall GetPort();
void __fastcall SetPort(int Val);
void __fastcall SetVersion(TGGClientVersion Val);
System::UnicodeString __fastcall GetHost();
void __fastcall SetHost(System::UnicodeString Val);
// For __published Events
TGGErrorEvent FOnError;
TNotifyEvent FOnDisconnect;
TNotifyEvent FOnLogin;
TStatusEvent FOnStatusChange;
TMsgEvent FOnMessage;
TAckEvent FOnConfirmMsg;
protected: const static MAX_MSG_LEN = 1920;
int __fastcall Send(TDataStream &Data, int MessageType);
int __fastcall Send(void *Data, int Len);
int __fastcall Recv(void *Data, int Len);
void __fastcall HClear();
void __fastcall Debug(unsigned char *Data, unsigned int Len);
unsigned int __fastcall GetCRC32(const unsigned char *Data, const unsigned int Size);
char *__fastcall UTF8ToAnsi(UnicodeString UString);
int __fastcall HashUIN(const unsigned char *password, int seed);
void __fastcall GetGGHost(void);
void __fastcall SendUserList(void);
TGGUinFlag __fastcall ConvertUinFlag(Byte Flag);
TGG_UserStatus __fastcall ConvertUserStatus(Byte Status);
// ...
// Fragment wycięty
// ...
int __fastcall ObtainStatus(TGG_UserStatus Status);
Byte __fastcall ObtainMsgClass(TGGMsgClass Status);
bool __fastcall SendMessageEx(int Uin, Byte *Message, int Length, int Sequence, TGGMsgClass Class);
void __fastcall GG_Error(int ErrorID, UnicodeString Msg);
// This Events
virtual inline void __fastcall Message(TObject *Sender, TGG_Message *Msg)
{
if (OnMessage) OnMessage(Sender, Msg);
}
virtual inline void __fastcall Login(TObject *Sender)
{
if (OnLogin) OnLogin(Sender);
}
virtual inline void __fastcall StatusChange(TObject *Sender, TGGNotiy *Notify)
{
if (OnStatusChange) OnStatusChange(Sender, Notify);
}
// ...
// Fragment wycięty
// ...
// Przeładowujemy funkcje dla zmiennych TCP i Pinger
virtual void __fastcall TCP_Error(TObject *Sender, TCustomWinSocket *Socket, TErrorEvent ErrorEvent, int &ErrorCode);
virtual void __fastcall TCP_Read(TObject *Sender, TCustomWinSocket *Socket);
virtual void __fastcall TCP_Connect(TObject *Sender, TCustomWinSocket *Socket);
virtual void __fastcall TCP_Disconnect(TObject *Sender, TCustomWinSocket *Socket);
virtual void __fastcall TIM_Pinger(TObject *Sender);
public: __fastcall TGG(TComponent *Owner);
__fastcall~TGG();
virtual void __fastcall SignIn(); // Zaloguj się
virtual bool __fastcall IsLogged();
virtual void __fastcall UpdateStatus();
virtual void __fastcall Logout();
virtual bool __fastcall SendMessage(int Uin, UnicodeString Message, TGGMsgClass Class = msChat);
virtual bool __fastcall SendImage(int Uin, UnicodeString FilePath);
TNotifyUserList *UserList;
__published:
// Proporties
__property int Uin = {
read = FUin, write = FUin,
default = 0
};
__property System::UnicodeString Password = {
read = FPass, write = FPass
};
__property System::UnicodeString Host = {
read = GetHost, write = SetHost
};
__property int Port = {
read = GetPort, write = SetPort,
default = 8074
};
__property bool FreiendsOnly = {
read = FFriOnly, write = FFriOnly,
default = false
};
__property TGGClientVersion Version = {
read = FVersion, write = SetVersion,
default = cvVer7
};
__property TGG_UserStatus Status = {
read = FStatus, write = FStatus,
default = usAvailable
};
__property System::UnicodeString Description = {
read = FDesc, write = FDesc
};
__property bool AutoConnect = {
read = FAutoConn, write = FAutoConn,
default = false
};
// Events
__property TGGErrorEvent OnError = {
read = FOnError, write = FOnError
};
__property TNotifyEvent OnDisconnect = {
read = FOnDisconnect, write = FOnDisconnect
};
__property TNotifyEvent OnLogin = {
read = FOnLogin, write = FOnLogin
};
__property TStatusEvent OnStatusChange = {
read = FOnStatusChange, write = FOnStatusChange
};
__property TMsgEvent OnMessage = {
read = FOnMessage, write = FOnMessage
};
__property TAckEvent OnConfirmMsg = {
read = FOnConfirmMsg, write = FOnConfirmMsg
};
};
__fastcall TGG::TGG(TComponent *Owner): TComponent(Owner)
{
Zalogowany = false;
Pinger = new TTimer(NULL);
Pinger->Enabled = false;
Pinger->OnTimer = TIM_Pinger;
TCP = new TClientSocket(NULL);
TCP->Port = 8074;
TCP->ClientType = ctNonBlocking;
TCP->OnError = TCP_Error;
TCP->OnRead = TCP_Read;
// ...
// Fragment wycięty
// ...
if (!ComponentState.Contains(csDesigning))
{
UserList = new TNotifyUserList(TCP);
}
}
//---------------------------------------------------------------------------
void __fastcall TGG::TIM_Pinger(TObject *Sender)
{
if (IsLogged() && (LastActivity + (PING_INTERVAL *1000)) < GetTickCount())
{
GG_Header Ping = {
DEX_GG_PING, 0
};
Send( &Ping, sizeof(GG_Header));
LastActivity = GetTickCount();
}
else if (AutoConnect) SignIn();
}
//---------------------------------------------------------------------------
void __fastcall TGG::SignIn()
{
if (IsLogged() == false) // Gdy niezalogowany
{
if (Password.Length() <= 0 || Uin == 0) GG_Error(5, "Brak loginu lub hasła"); // Podaj uin i passy
else
{
if (Port <= 0 || Host.Length() <= 0) GetGGHost(); // Pobierz adres IP i port z serwera GG
TCP->Open(); // Połącz
}
}
}
//---------------------------------------------------------------------------
void __fastcall TGG::Logout()
{
if (Zalogowany && TCP->Socket->Connected)
{
TGG_UserStatus tmpStatus = Status;
Status = usNotAvailable;
UpdateStatus();
Status = tmpStatus;
Sleep(100);
Zalogowany = false;
TCP->Close();
}
}
//---------------------------------------------------------------------------
bool __fastcall TGG::IsLogged()
{
return (Zalogowany && TCP->Socket->Connected);
}
//---------------------------------------------------------------------------
void __fastcall TGG::TCP_Read(TObject *Sender, TCustomWinSocket *Socket)
{
Recv( &RHead, sizeof(GG_Header));
if (RHead.Type == DEX_GG_WELCOME)
{
int Seed = 0;
Recv( &Seed, RHead.Length);
HClear();
// Zaloguj
TDataStream LoginData;
LoginData.Add(Uin); /* mój numerek */
// ...
// Fragment wycięty
// ...
Send(LoginData, DEX_GG_LOGIN70);
}
unsigned int Size = Socket->ReceiveLength();
if (RHead.Type == 0x1F || RHead.Type == 0x00 || RHead.Type == DEX_GG_PONG || Size == 0) return;
else if (RHead.Type == DEX_GG_LOGIN_OK || RHead.Type == DEX_GG_NEED_EMAIL)
{
Zalogowany = true;
//Sleep(100);
UpdateStatus();
GG_Header Head = {
DEX_GG_LIST_EMPTY, 0
};
Send( &Head, sizeof(GG_Header));
SendUserList();
Pinger->Interval = PING_INTERVAL *1000;
Pinger->Enabled = true;
Login(this);
}
// < Notyfi >
else if (RHead.Type == DEX_GG_NOTIFY_REPLY77)
{
TGG_Notify_Reply77 Reply;
memset( &Reply, 0, sizeof(TGG_Notify_Reply77));
Recv( &Reply, RHead.Length);
int Uin = (Reply.uin &0x00FFFFFF);
if (Uin == 0) return;
TGGNotiy Notify;
Notify.Login = Uin;
Notify.Notify = true;
Notify.Flag = ConvertUinFlag(Reply.uin &0xFF000000);
Notify.Status = ConvertUserStatus(Reply.status);
Notify.Version = Reply.version;
Notify.Port = Reply.remote_port;
Notify.IP = ConvertIP(Reply.remote_ip);
Notify.MaxImageSize = Reply.image_size;
Notify.Description = Reply.description;
Notify.Time = UnixToDateTime(Reply.time); //0;
if (Notify.Description.Length() > Reply.description_size) Notify.Description.SetLength(Reply.description_size);
StatusChange(this, &Notify);
}
else if (RHead.Type == DEX_GG_NOTIFY_REPLY)
{
GG_Error(345, "DEX_GG_NOTIFY_REPLY");
}
else if (RHead.Type == DEX_GG_NOTIFY_REPLY80)
{
GG_Error(345, "DEX_GG_NOTIFY_REPLY80");
}
else if (RHead.Type == DEX_GG_NOTIFY_REPLY60)
{
// ...
// Fragment wycięty
// ...
// < / Notyfi >
else if (RHead.Type == DEX_GG_RECV_MSG)
{
TGG_Recv_MSG Message;
memset( &Message, 0, sizeof(TGG_Recv_MSG));
// ...
// Fragment wycięty
// ...
if (MsgLength > MAX_MSG_LEN) MsgLength = MAX_MSG_LEN; // GG_Error();
Msg.Message = AnsiString::StringOfChar(0, MsgLength);
memcpy((char *) Msg.Message.data(), Message.message, MsgLength);
this->Message(this, &Msg);
}
else if (RHead.Type == DEX_GG_SEND_MSG_ACK)
{
TGG_Send_MSG_Ack ack;
memset( &ack, 0, sizeof(TGG_Send_MSG_Ack));
Recv( &ack, RHead.Length);
TGG_MSG_Ack ACK;
ACK.State = ConvertACK(ack.stan);
ACK.Recipient = ack.recipient;
ACK.Sequence = ack.seq;
ConfirmMsg(this, &ACK);
}
else if (RHead.Type == DEX_GG_LOGIN_FAILED)
{
GG_Error(101, "Błąd logowania");
Logout(); // -> TCP_Disconnect -> OnDisconnect
return;
}
else if (RHead.Type == DEX_GG_DISCONNECTING)
{
GG_Error(12, "Serwer Gadu Gadu rozłączył Cię");
Logout(); // Disconnect
return;
}
else // Nie wiadomo co?!
{
// ...
// Fragment wycięty
// ...
}
}
}
//---------------------------------------------------------------------------
void __fastcall TGG::Debug(unsigned char *Data, unsigned int Len)
{
UnicodeString Out = "";
for (unsigned int i = 0; i < Len; i++)
{
Out += IntToHex(Data[i], 2) + " ";
if ((i + 1) % 4 == 0) Out += " ";
}
GG_Error(668, Out);
}
//---------------------------------------------------------------------------
//void __fastcall TGG::TCP_Connect(TObject *Sender, TCustomWinSocket *Socket) { }
void __fastcall TGG::TCP_Disconnect(TObject *Sender, TCustomWinSocket *Socket)
{
Zalogowany = false;
if (AutoConnect) Pinger->Interval = 10 *1000; // 10 sec
else Pinger->Enabled = false;
Disconnect(this);
}
//---------------------------------------------------------------------------
void __fastcall TGG::TCP_Error(TObject *Sender, TCustomWinSocket *Socket, TErrorEvent ErrorEvent, int &ErrorCode)
{
UnicodeString Error = "";
switch (ErrorEvent)
{
case eeConnect:
Error = "Błąd prz podłączaniu do serwera";
break;
case eeSend:
Error = "Błąd w wysyłaniu";
break;
case eeReceive:
Error = "Błąd w odbieraniu danych";
break;
case eeDisconnect:
Error = "Błąd w rozłączaniu";
break;
case eeAccept:
Error = "Błąd przy próbie akceptacji połączenia klienta";
break;
case eeGeneral:
Error = "Wystąpił nieokreślony błąd w komunikacji";
break;
default:
Error = "Nieznany błąd";
}
GG_Error(ErrorCode, Error);
TCP->Close();
Disconnect(this); // Experimental
//Logout(); // Experimental
ErrorCode = 0;
}
//---------------------------------------------------------------------------
void __fastcall TGG::GG_Error(int ErrorID, UnicodeString Msg)
{
Error(this, ErrorID, Msg);
if (ErrorID != 0) MessageBoxW(NULL, Msg.w_str(), NULL, MB_OK | MB_ICONHAND); // Default
}
bool __fastcall TGG::SendMessage(int Uin, UnicodeString Message, TGGMsgClass Class)
{
return SendMessageEx(Uin, UTF8ToAnsi(Message), Message.Length(), DateTimeToUnix(TDateTime::CurrentDateTime()), Class);
}
//---------------------------------------------------------------------------
bool __fastcall TGG::SendMessageEx(int Uin, Byte *Message, int Length, int Sequence, TGGMsgClass Class)
{
// ...
// Fragment wycięty
// ...
}
//---------------------------------------------------------------------------
int __fastcall TGG::Send(TDataStream &Data, int MessageType)
{
GG_Header Head = {
MessageType, Data.GetLength()
};
Send( &Head, sizeof(GG_Header));
Send(Data.GetData(), Head.Length);
return Head.Length;
}
//---------------------------------------------------------------------------
bool __fastcall TGG::SendImage(int Uin, UnicodeString FilePath)
{
// ...
// Fragment wycięty
// ...
}
//---------------------------------------------------------------------------
unsigned int __fastcall TGG::GetCRC32(const unsigned char *Data, const unsigned int Size)
{
const static unsigned int CRCTable[] = {
0x00000000, 0x77073096, 0xEE0E612C, 0x990951BA, 0x076DC419, 0x706AF48F, 0xE963A535, 0x9E6495A3, 0x0EDB8832, 0x79DCB8A4, 0xE0D5E91E, 0x97D2D988, 0x09B64C2B, 0x7EB17CBD, 0xE7B82D07, 0x90BF1D91,
// ...
// Fragment wycięty
// ...
0xBDBDF21C, 0xCABAC28A, 0x53B39330, 0x24B4A3A6, 0xBAD03605, 0xCDD70693, 0x54DE5729, 0x23D967BF, 0xB3667A2E, 0xC4614AB8, 0x5D681B02, 0x2A6F2B94, 0xB40BBE37, 0xC30C8EA1, 0x5A05DF1B, 0x2D02EF8D
};
unsigned int CRC32 = 0xFFFFFFFF;
for (unsigned long int i = 0; i < Size; i++)
{
CRC32 = (CRC32 >> 6) ^ CRCTable[(CRC32 &0xFF) ^ Data[i]];
}
CRC32 ^= 0xFFFFFFFF;
return CRC32;
}
//---------------------------------------------------------------------------//
// Inne //
//---------------------------------------------------------------------------//
int __fastcall TGG::Send(void *Data, int Len)
{
return TCP->Socket->SendBuf(Data, Len);
}
int __fastcall TGG::Recv(void *Data, int Len)
{
return TCP->Socket->ReceiveBuf(Data, Len);
}
void __fastcall TGG::HClear()
{
RHead.Type = 0;
RHead.Length = 0;
}
//---------------------------------------------------------------------------
int __fastcall TGG::GetPort()
{
return TCP->Port;
}
void __fastcall TGG::SetPort(int Val)
{
TCP->Port = Val;
}
void __fastcall TGG::SetVersion(TGGClientVersion Val)
{
if (IsLogged() == false) FVersion = Val;
}
System::UnicodeString __fastcall TGG::GetHost()
{
return TCP->Host;
}
void __fastcall TGG::SetHost(System::UnicodeString Val)
{
TCP->Host = Val;
}
//---------------------------------------------------------------------------
char *__fastcall TGG::UTF8ToAnsi(UnicodeString UString)
{
return AnsiString(UString).c_str();
}
//---------------------------------------------------------------------------
void __fastcall TGG::GetGGHost()
{
AnsiString Source = "http://appmsg.gadu-gadu.pl/appsvc/appmsg4.asp?fmnumber=" + IntToStr(Uin) + "&&version=7,7,0,3315&&lastmsg=1";
AnsiString IP = "";
Port = 0;
HINTERNET hSession;
hSession = InternetOpenA("", INTERNET_OPEN_TYPE_DIRECT, NULL, NULL, 0);
if (hSession)
{
HINTERNET hService;
hService = InternetOpenUrlA(hSession, Source.c_str(), NULL, 0, 0, 0);
if (hService)
{
while (true)
{
char lpBuffer[1024 + 1];
DWORD dwBytesRead;
InternetReadFile(hService, lpBuffer, 1024, &dwBytesRead);
if (dwBytesRead <= 0) break;
lpBuffer[dwBytesRead] = 0;
IP += lpBuffer;
}
}
InternetCloseHandle(hService);
}
InternetCloseHandle(hSession);
// ...
// Fragment wycięty
// ...
Host = IP;
}
//---------------------------------------------------------------------------
int __fastcall TGG::HashUIN(const unsigned char *password, int seed)
{
Byte *Pass = new Byte[strlen(password) + 1];
memset(Pass, 0, strlen(password) + 1);
memcpy(Pass, password, strlen(password));
unsigned int x, y, z;
y = seed;
for (x = 0; *Pass; Pass++)
{
x = (x &0xFFFFFF00) | *Pass;
y ^= x;
y += x;
x <<= 8;
y ^= x;
x <<= 8;
y -= x;
x <<= 8;
y ^= x;
z = y &0x1F;
y = (y << z) | (y >> (32 - z));
}
return y;
}
//---------------------------------------------------------------------------
// ...
// Fragment wycięty
// ...
//---------------------------------------------------------------------------
void __fastcall TGG::SendUserList()
{
TNotifyUser *Aktualny = UserList->GetFirst();
while (Aktualny)
{
TDataStream User;
User.Add(Aktualny->uin);
User.Add < char > (Aktualny->Type);
Send(User, DEX_GG_ADD_NOTIFY);
Aktualny = Aktualny->next;
//Application->ProcessMessages();
}
}
//---------------------------------------------------------------------------
UnicodeString __fastcall TGG::ConvertIP(int IP)
{
BYTE a, b, c, d;
a = (IP &0xFF000000) >> 24;
// ...
// Fragment wycięty
// ...
return Format("%d.%d.%d.%d", ARRAYOFCONST((d, c, b, a)));
}
//---------------------------------------------------------------------------
TGGUinFlag __fastcall TGG::ConvertUinFlag(Byte Flag)
{
switch (Flag)
{
case DEX_GG_UINFLAG_UNKNOWN2:
return ufInvisible;
case DEX_GG_UINFLAG_VOICE:
return ufVoice;
case DEX_GG_UINFLAG_ERA_OMNIX:
return ufEraOmnix;
default:
return ufUnknown;
}
}
//---------------------------------------------------------------------------
TGG_UserStatus __fastcall TGG::ConvertUserStatus(Byte Status)
{
switch (Status)
{
case DEX_GG_STATUS_NOT_AVAIL:
case DEX_GG_STATUS_NOT_AVAIL_DESCR:
return usNotAvailable;
case DEX_GG_STATUS_AVAIL:
case DEX_GG_STATUS_AVAIL_DESCR:
return usAvailable;
// ...
// Fragment wycięty
// ...
}
return usAvailable;
}
//---------------------------------------------------------------------------
TGGMsgClass __fastcall TGG::ConvertMsgClass(Byte Status)
{
switch (Status)
{
case DEX_GG_CLASS_QUEUED:
return msQueued;
case DEX_GG_CLASS_MSG:
return msNewWindow;
case DEX_GG_CLASS_CHAT:
return msChat;
case DEX_GG_CLASS_CTCP:
return msTCP;
case DEX_GG_CLASS_ACK:
return msNoACK;
default:
return msChat;
}
}
//---------------------------------------------------------------------------
unsigned long int TGG::DateTimeToUnix(TDateTime ConvDate)
{
return Round((ConvDate - TDateTime(25569.0)) *86400);
}
TDateTime __fastcall TGG::UnixToDateTime(unsigned long int USec)
{
return TDateTime(USec / 86400.0) + TDateTime(25569.0);
}
//---------------------------------------------------------------------------
__fastcall TGG::~TGG()
{
AutoConnect = false;
if (IsLogged()) Logout();
delete UserList;
UserList = NULL;
delete TCP;
TCP = NULL;
delete Pinger;
Pinger = NULL;
}
//---------------------------------------------------------------------------
namespace Tgg
{
void __fastcall PACKAGE Register()
{
TComponentClass classes[1] = {
__classid(TGG)
};
RegisterComponents(L "Internet", classes, 0);
}
}
/*********************************************************/
/* NADAWCA */
/*********************************************************/
{
bool zmienna_bool = true;
TVarList Vars;
Vars << "Napis" << 15 << zmienna_bool << 3.14; // Dodajemy zmienne (dowolnego typu) do strumienia danych
int rozmiar;
void* Dane;
Vars.Serialize(Dane, rozmiar); // Zapisujemy zmienne do bufora danych "Dane"...
socket.send(Dane, rozmiar); // ... i wysyłamy go
}
/*********************************************************/
/* ODBIORCA */
/*********************************************************/
{
int rozmiar;
void* OdebraneDane;
socket.receive(OdebraneDane, rozmiar); // odbieramy bufor danych z wysłanymi zmiennymi
TVarList Vars;
Vars.Unserialize(OdebraneDane);
char *Napis = Vars[0]->Value; // Strumień "wie" jakiego typu przechowuje zmienne
int liczba = Vars[1]->Value; // i automatycznie zwraca wymagany typ danych
bool zmienna_bool = Vars[2]->Value; // bez potrzeby rzutowania ;
float pi = Vars[3]->Value;
}
// ...
// Fragment wycięty
// ...
enum TVarMainType
{
vm_UNKNOWN, vm_NUMERIC, vm_STRING, vm_DATA
};
enum TVarSign
{
vs_Unknown, vs_Signed, vs_Unsigned
};
enum TVarSubType
{
st_Unknown, st_Char, st_WChar_t, st_Short, st_Int, st_Int64, st_Float, st_Double, st_LongDouble
};
class TMyVarType
{
protected: TVarMainType Type;
TVarSign Scope;
TVarSubType Details;
bool Pointer;
public: TMyVarType(): Type(vm_UNKNOWN),
Scope(vs_Unknown),
Details(st_Unknown),
Pointer(false)
{}
TMyVarType &operator << (TVarMainType Type)
{
this->Type = Type;
return *this;
};
TMyVarType &operator << (TVarSign Scope)
{
this->Scope = Scope;
return *this;
};
TMyVarType &operator << (TVarSubType Details)
{
this->Details = Details;
return *this;
};
TMyVarType &operator << (bool Pointer)
{
this->Pointer = Pointer;
return *this;
};
operator == (TVarMainType Type)
{
return this->Type == Type;
};
operator == (TVarSign Scope)
{
return this->Scope == Scope;
};
operator == (TVarSubType Details)
{
return this->Details == Details;
};
operator == (bool Pointer)
{
return this->Pointer == Pointer;
};
operator TVarMainType()
{
return this->Type;
};
operator TVarSign()
{
return this->Scope;
};
operator TVarSubType()
{
return this->Details;
};
operator bool()
{
return this->Pointer;
};
}; /******************************** TVarNumeric *********************************/
class TVarValue
{
protected: wchar_t *ToUnicode(const char *AnsiText);
char *ToAnsi(const wchar_t *UnicodeText);
wchar_t *CopyStr(const wchar_t *UnicodeText);
char *CopyStr(const char *AnsiText);
char *GetAs_char();
wchar_t *GetAs_wchar_t();
template < class T > T GetAs_others();
friend class TVarItem;
TVarItem *Owner_Item;
public:
explicit operator char *();
explicit operator const char *();
explicit operator AnsiString();
explicit operator wchar_t *();
explicit operator const wchar_t *();
explicit operator UnicodeString();
template < class T > operator T();
};
/********************************** TVarList *********************************/
class TVarList
{
private: typedef unsigned char BYTE;
friend class TVarValue;
unsigned int BYTE_size;
unsigned int package_size;
unsigned int TotalSize;
protected: TPtrList *List;
bool SkipPattern(AnsiString &Base, AnsiString Pattern);
template < class T > TMyVarType GetTypeOf(T Var);
public: TVarList();~TVarList();
//---
template < class T > TVarList &Add(T Value);
TVarList &AddString(const char *cString);
TVarList &AddString(const wchar_t *wString);
TVarList &AddData(void *Data, unsigned int Length, bool Reference = true);
//---
template < class T > TVarList &operator << (T Value);
TVarList &operator << (const char *Value);
TVarList &operator << (char *Value);
TVarList &operator << (const wchar_t *Value);
TVarList &operator << (wchar_t *Value);
TVarList &operator << (AnsiString Value); //friend TVarList& operator << (TVarList& List, AnsiString Value);
TVarList &operator << (UnicodeString Value);
TVarList &operator << (VAR_DATA Data);
TVarItem *operator[](unsigned int Index)
{
return (TVarItem *) List->Item[Index]->Data;
}
void Seralize(void *& OutputData, unsigned int &Length);
bool Unseralize(const void *InputData);
};
// ...
// Fragment wycięty
// ...
//TVarList& operator << (TVarList& List, AnsiString Value)
template < > TVarList &TVarList::operator << (const char *Value)
{
return AddString(Value);
}
template < > TVarList &TVarList::operator << (char *Value)
{
return AddString(Value);
}
template < > TVarList &TVarList::operator << (const wchar_t *Value)
{
return AddString(Value);
}
template < > TVarList &TVarList::operator << (wchar_t *Value)
{
return AddString(Value);
}
template < > TVarList &TVarList::operator << (AnsiString Value)
{
return AddString(Value.c_str());
}
template < > TVarList &TVarList::operator << (UnicodeString Value)
{
return AddString(Value.w_str());
}
template < > TVarList &TVarList::operator << (VAR_DATA Data)
{
return AddData(Data.Data, Data.Length, Data.Reference);
}
template < class T > TVarList &TVarList::operator << (T Value)
{
return Add(Value);
}
// ...
// Fragment wycięty
// ...
TVarList::TVarList(): TotalSize(4)
{
List = new TPtrList(NULL);
List->AllocBy = 6;
BYTE_size = sizeof(BYTE);
package_size = sizeof(unsigned int) + (3 *BYTE_size) + sizeof(bool);
}
//---------------------------------------------------------------------------
TVarList::~TVarList()
{
TotalSize = 0;
for (unsigned int i = 0; i < List->Count; i++)
{
TVarItem *Item = this->operator[](i);
if (Item->Reference == false)
{
if (Item->Data) delete[] Item->Data;
Item->Data = NULL;
}
}
List->Clear();
}
//---------------------------------------------------------------------------
template < class T > TMyVarType TVarList::GetTypeOf(T Var)
{
const std::type_info &Type = typeid(Var);
const char *cTypeName = Type.name();
int status = 0;
#ifdef ABI_DEMANGLE
#include < cxxabi.h >
cTypeName = abi::__cxa_demangle(cTypeName, 0, 0, &status);
#endif
if (cTypeName[0] == '\0' || status != 0) throw Exception("TVarList: Can't obtain variable type!");
// ...
// Fragment wycięty
// ...
}
//---------------------------------------------------------------------------
TVarList &TVarList::AddString(const wchar_t *wString)
{
TVarItem *Var = new TVarItem(this);
Var->Type << vm_STRING << st_WChar_t;
Var->DataLength = wcslen(wString) *sizeof(wchar_t) + 1;
wchar_t *CopyStr = new wchar_t[Var->DataLength + 1];
_wcspcpy(CopyStr, wString);
Var->Data = CopyStr;
List->Add(Var);
TotalSize += Var->DataLength + package_size;
return *this;
}
//---------------------------------------------------------------------------
TVarList &TVarList::AddString(const char *cString)
{
// ...
// Fragment wycięty
// ...
}
//---------------------------------------------------------------------------
TVarList &TVarList::AddData(void *Data, unsigned int Length, bool Reference)
{
TVarItem *Var = new TVarItem(this);
Var->Type << vm_DATA;
Var->DataLength = Length;
if (Reference)
{
Var->Data = Data;
}
else
{
BYTE *CopyData = new BYTE[Length + 1];
memcpy(CopyData, Data, Length);
Var->Data = CopyData;
}
Var->Reference = Reference;
List->Add(Var);
TotalSize += Var->DataLength + package_size;
return *this;
}
//---------------------------------------------------------------------------
template < class T > TVarList &TVarList::Add(T Value)
{
TVarItem *Var = new TVarItem(this);
Var->Type = GetTypeOf(Value);
if (Var->Type == vm_NUMERIC)
{
T *NewValue = new T; *NewValue = Value;
Var->DataLength = sizeof(T);
Var->Data = NewValue;
}
List->Add(Var);
TotalSize += Var->DataLength + package_size;
return *this;
}
//---------------------------------------------------------------------------
void TVarList::Seralize(void *& OutputData, unsigned int &Length)
{
Length = TotalSize;
OutputData = new unsigned char[TotalSize];
memset(OutputData, 0, TotalSize);
BYTE *Ptr = (BYTE *) OutputData; *Ptr = List->Count;
Ptr += sizeof(List->Count);
for (unsigned int i = 0; i < List->Count; i++)
{
TVarItem *Item = this->operator[](i);
TVarMainType Type = Item->Type;
TVarSign Scope = Item->Type;
TVarSubType Details = Item->Type;
bool Pointer = Item->Type;
*Ptr = (BYTE) Type;
Ptr += BYTE_size; *Ptr = (BYTE) Scope;
Ptr += BYTE_size; *Ptr = (BYTE) Details;
Ptr += BYTE_size; *Ptr = (BYTE) Pointer;
Ptr += BYTE_size;
*Ptr = Item->DataLength;
Ptr += sizeof(Item->DataLength);
memcpy(Ptr, Item->Data, Item->DataLength);
Ptr += Item->DataLength;
}
}
//---------------------------------------------------------------------------
bool TVarList::Unseralize(const void *InputData)
{
if (InputData == NULL) return false;
BYTE *Ptr = (BYTE *) InputData;
unsigned int Count = *reinterpret_cast < unsigned int *> (Ptr);
Ptr += sizeof(unsigned int);
if (Count == 0) return false;
List->Clear();
for (unsigned int i = 0; i < Count; i++)
{
TVarMainType Type = *reinterpret_cast < BYTE *> (Ptr);
Ptr += BYTE_size;
TVarSign Scope = *reinterpret_cast < BYTE *> (Ptr);
Ptr += BYTE_size;
TVarSubType Details = *reinterpret_cast < BYTE *> (Ptr);
Ptr += BYTE_size;
bool Pointer = *reinterpret_cast < bool *> (Ptr);
Ptr += sizeof(bool);
TVarItem *Item = new TVarItem(this);
Item->Type << Type << Scope << Details << Pointer;
Item->DataLength = *reinterpret_cast < unsigned int *> (Ptr);
Ptr += sizeof(unsigned int);
if (Item->DataLength == 0) return false;
BYTE *Data = new BYTE[Item->DataLength];
memcpy(Data, Ptr, Item->DataLength);
Item->Data = Data;
Ptr += Item->DataLength;
List->Add(Item);
TotalSize += Item->DataLength + package_size;
}
return true;
}
// ...
// Fragment wycięty
// ...
/***************************** TVarValue ************************************/
//---------------------------------------------------------------------------
wchar_t *TVarValue::ToUnicode(const char *AnsiText)
{
unsigned int Len = strlen(AnsiText);
wchar_t *UniBuffer = new wchar_t[Len + 1];
MultiByteToWideChar(CP_ACP, 0, AnsiText, Len, UniBuffer, Len + 1);
UniBuffer[Len] = '\0';
return UniBuffer;
}
//---------------------------------------------------------------------------
char *TVarValue::ToAnsi(const wchar_t *UnicodeText)
{
// ...
// Fragment wycięty
// ...
}
//---------------------------------------------------------------------------
wchar_t *TVarValue::CopyStr(const wchar_t *UnicodeText)
{
if (!UnicodeText) return NULL;
wchar_t *UnicodeBuffer = new wchar_t[wcslen(UnicodeText) + 1];
_wcspcpy(UnicodeBuffer, UnicodeText);
return UnicodeBuffer;
}
//---------------------------------------------------------------------------
char *TVarValue::CopyStr(const char *AnsiText)
{
// ...
// Fragment wycięty
// ...
}
//---------------------------------------------------------------------------
template < typename T > T TVarValue::GetAs_others()
{
ShowMessage("Wants return: " + AnsiString(typeid(T).name()));
T _temp;
TMyVarType TypeToReturn = Owner_Item->Owner_List->GetTypeOf(_temp);
TMyVarType TypeOfVar = Owner_Item->Type;
if (TypeToReturn == vm_NUMERIC)
{
if (TypeOfVar == vm_NUMERIC)
{
if (TypeOfVar == st_Char) return (T) *reinterpret_cast < char *> (Owner_Item->Data);
else if (TypeOfVar == st_WChar_t) return (T) *reinterpret_cast < wchar_t *> (Owner_Item->Data);
else if (TypeOfVar == st_Short) return (T) *reinterpret_cast < short *> (Owner_Item->Data);
else if (TypeOfVar == st_Int) return (T) *reinterpret_cast < int *> (Owner_Item->Data);
else if (TypeOfVar == st_Int64) return (T) *reinterpret_cast < long long int *> (Owner_Item->Data);
else if (TypeOfVar == st_Float) return (T) *reinterpret_cast < float *> (Owner_Item->Data);
else if (TypeOfVar == st_Double) return (T) *reinterpret_cast < double *> (Owner_Item->Data);
else if (TypeOfVar == st_LongDouble) return (T) *reinterpret_cast < long double *> (Owner_Item->Data);
}
else if (TypeOfVar == vm_DATA)
{
return *reinterpret_cast < T *> (Owner_Item->Data);
}
}
return 0; // Error
}
//---------------------------------------------------------------------------
char *TVarValue::GetAs_char()
{
if (!Owner_Item || Owner_Item->DataLength == 0) return ""; // Error
if (Owner_Item->Type == vm_STRING)
{
if (Owner_Item->Type == st_Char)
{
return (char *) Owner_Item->Data; // CopyStr((char *) Owner_Item->Data);
}
if (Owner_Item->Type == st_WChar_t)
{
return ToAnsi((wchar_t *) Owner_Item->Data);
}
}
return ""; // Error
}
//---------------------------------------------------------------------------
// ...
// Fragment wycięty
// ...
//---------------------------------------------------------------------------
template < > TVarValue::operator AnsiString()
{
return GetAs_char();
}
template < > TVarValue::operator UnicodeString()
{
return GetAs_wchar_t();
}
template < > TVarValue::operator char *()
{
return GetAs_char();
}
template < > TVarValue::operator const char *()
{
return GetAs_char();
}
template < > TVarValue::operator wchar_t *()
{
return GetAs_wchar_t();
}
template < > TVarValue::operator const wchar_t *()
{
return GetAs_wchar_t();
}
template < class T > TVarValue::operator T()
{
return GetAs_others < T > ();
}
//---------------------------------------------------------------------------
Damian Drygiel
| Data urodzenia: | 8 czerwca 1991 |
|---|---|
| Adres zamieszkania: | Warszawa, Bielany |
| Adres e-mail: | xxxxx@xx.xx |
| Numer telefonu: | 000 000 000 |
Prezentacja projektu własnej strony www na sympozjum w Pradze.
www.juniorinternet.pl
Organizator - Uniwersytet Jagielloński
Temat pracy - "interpolacja biliniowa"
www.zobaczycmatematyke.pl
Ponadto współorgnizator uroczystości "Laurów Czarniecczyków" oraz projektant dyplomów dla wyróżnionych.