#include <windows.h>
#include <ddeml.h>
#include <string.h>
#include "..\header\i_field.h" //Klassendefinition
#define TABLE_DEF_SIZE 5 //Anfangsgroesse der Tabelle
#define DELTA 5 //Betrag, um den die Anzahl der Tabelleneintraege erhoeht wird
void InfoField::AddEntry( HCONV hConv, HSZ hszItem, WORD cbFormat, char* szCallback, char* szDestMatrix, BOOL isString )
{
int strLength;
//doppelte Eintraege vermeiden
// InfoField::DelEntry( hConv, hszItem );
int nextFreeEntry = InfoField::GetNextFreeEntry();
Field[nextFreeEntry] = new DDEAdviseInfoField; //neues InfoField-Objekt erzeugen
//und mit Daten auffuellen
Field[nextFreeEntry]->hConv = hConv;
Field[nextFreeEntry]->hszItem = hszItem;
Field[nextFreeEntry]->cbFormat = cbFormat;
if ( szCallback ) //wenn Callbackstring ungleich ''
{
strLength = strlen( szCallback );
Field[nextFreeEntry]->szCallback = new char[strLength+1];
strcpy( Field[nextFreeEntry]->szCallback, szCallback );
}
else
Field[nextFreeEntry]->szCallback = NULL;
if ( szDestMatrix ) //nur bei Hot-Link String reservieren
{
strLength = strlen( szDestMatrix );
Field[nextFreeEntry]->szDestMatrix = new char[strLength+1];
strcpy( Field[nextFreeEntry]->szDestMatrix, szDestMatrix );
Field[nextFreeEntry]->isString = isString;
}
else
{
Field[nextFreeEntry]->szDestMatrix = NULL;
Field[nextFreeEntry]->isString = FALSE;
}
}
BOOL InfoField::DelEntry( HCONV hConv, HSZ hszItem, WORD cbFormat )
{
int entry2Del = InfoField::SearchEntry( hConv, hszItem, cbFormat );
if ( entry2Del == -1 )
return FALSE;
delete [] Field[entry2Del]->szCallback; //Strings freigeben
delete [] Field[entry2Del]->szDestMatrix;
delete Field[entry2Del]; //InfoField-Objekt freigeben
Field[entry2Del] = NULL; //Tabelleneintrag als frei markieren
return TRUE;
}
char* InfoField::GetCallback( HCONV hConv, HSZ hszItem, WORD cbFormat )
{
int entryReq = InfoField::SearchEntry( hConv, hszItem, cbFormat );
if ( entryReq == -1 )
return NULL;
return Field[entryReq]->szCallback;
}
char* InfoField::exGetCallback( HCONV hConv, int* index )
{
for ( int count = *index; count < tableSize; count++ )
{
if ( Field[count] ) //nur in belegten Tabelleneintraegen suchen
{
if ( Field[count]->hConv == hConv ) //Tabelleneintrag gefunden
{
*index = ( count + 1 ); //naechste Suche eine Position nach diesem Eintrag beginnen
return Field[count]->szCallback;
}
}
}
return (char*)-1; //Ende erreicht
}
char* InfoField::GetDestMatrix( HCONV hConv, HSZ hszItem, WORD cbFormat )
{
int entryReq = InfoField::SearchEntry( hConv, hszItem, cbFormat );
if ( entryReq == -1 )
return NULL;
return Field[entryReq]->szDestMatrix;
}
BOOL InfoField::IsStringMatrix( HCONV hConv, HSZ hszItem, WORD cbFormat )
{
int entryReq = InfoField::SearchEntry( hConv, hszItem, cbFormat );
if ( entryReq == -1 )
return FALSE;
return Field[entryReq]->isString;
}
///////////////////////////////////////////Hilfsfunktionen der Klasse (protected)
//Suche eines freien Tabelleneintrages, wenn AddEntry() aufgerufen wurde
int InfoField::GetNextFreeEntry()
{
int count;
for ( count = 0; count < tableSize; count++ )
{
if ( Field[count] == NULL ) //freier Tabelleneintrag
return count;
}
InfoField::ResizeTable(); //Tabelle muss vergroessert werden...
return count;
}
//Durchsuchen der Tabelle nach gegebenen hConv und hszItem
int InfoField::SearchEntry( HCONV hConv, HSZ hszItem, WORD cbFormat )
{
int count;
for ( count = 0; count < tableSize; count++ )
{
if ( Field[count] ) //nur in belegten Tabelleneintraegen suchen
{
if ( Field[count]->hConv == hConv &&
Field[count]->hszItem == hszItem &&
Field[count]->cbFormat == cbFormat )
return count; //Tabelleneintrag gefunden
}
}
return -1; //Error, Eintrag nicht gefunden.
}
//wenn alte Tabelle zu klein ist, wird sie in eine neue, groessere kopiert und dann geloescht.
void InfoField::ResizeTable()
{
DDEAdviseInfoField** Temp;
tableSize += DELTA;
Temp = new DDEAdviseInfoField* [tableSize];
InfoField::InitTable( Temp );
//alte Tabelle in neue kopieren
for ( int i = 0; i < (tableSize - DELTA); i++ )
Temp[i] = Field[i];
delete [] Field;
Field = Temp;
}
//Initialisierung einer Tabelle mit NULL
void InfoField::InitTable( DDEAdviseInfoField** ResetField)
{
for ( int i = 0; i < tableSize; i++ )
ResetField[i] = NULL;
}
//Constructor
InfoField::InfoField()
{
tableSize = TABLE_DEF_SIZE; //Startgroesse
Field = new DDEAdviseInfoField* [tableSize]; //Tabellenobjekt mit Zeigern auf InfoFields
InfoField::InitTable( Field );
}
//Destructor
InfoField::~InfoField()
{
for ( int i = 0; i < tableSize; i++ )
{
delete [] Field[i]->szCallback; //Strings freigeben
delete [] Field[i]->szDestMatrix;
delete Field[i]; //InfoField-Objekt freigeben
}
delete [] Field;
}
Detected encoding: ASCII (7 bit) | 2
|