@Houdini: stimmt, hast recht
Code: Alles auswählen
static void sendAllEvents(int connfd, t_channel_id serviceUniqueKey, bool oldFormat = true )
{
#define EVENT_CACHE (65*1024)
char *evtList = new char[EVENT_CACHE]; // 65kb should be enough and dataLength is unsigned short
char *event = new char[2*1024];
if (!evtList || !event)
{
fprintf(stderr, "low on memory!\n");
return ;
}
dprintf("sendAllEvents for " PRINTF_CHANNEL_ID_TYPE "\n", serviceUniqueKey);
*evtList = *event = 0;
char *p_event = event;
if (serviceUniqueKey != 0)
{
// service Found
if (EITThreadsPause())
{
delete[] evtList;
delete[] event;
return ;
}
lockEvents();
int serviceIDfound = 0;
for (MySIeventsOrderServiceUniqueKeyFirstStartTimeEventUniqueKey::iterator e = mySIeventsOrderServiceUniqueKeyFirstStartTimeEventUniqueKey.begin(); e != mySIeventsOrderServiceUniqueKeyFirstStartTimeEventUniqueKey.end(); e++)
{
if ((*e)->get_channel_id() == serviceUniqueKey)
{
serviceIDfound = 1;
for (SItimes::iterator t = (*e)->times.begin(); t != (*e)->times.end(); t++)
{
if ( oldFormat )
{
char strZeit[50];
sprintf(strZeit, "%012llx ", (*e)->uniqueKey());
strcat(p_event, strZeit);
struct tm *tmZeit;
tmZeit = localtime(&(t->startzeit));
sprintf(strZeit, "%02d.%02d %02d:%02d %u ",
tmZeit->tm_mday, tmZeit->tm_mon + 1, tmZeit->tm_hour, tmZeit->tm_min, (*e)->times.begin()->dauer / 60);
strcat(p_event, strZeit);
strcat(p_event, (*e)->name.c_str());
strcat(p_event, "\n");
}
else
{
*((event_id_t *)p_event) = (*e)->uniqueKey();
p_event += sizeof(event_id_t);
*((unsigned *)p_event) = t->startzeit;
p_event += 4;
*((unsigned *)p_event) = t->dauer;
p_event += 4;
strcpy(p_event, (*e)->name.c_str());
p_event += strlen(p_event);
p_event++;
if (((*e)->text).empty())
{
strcpy(p_event, (*e)->extendedText.substr(0, 40).c_str());
p_event += strlen(p_event);
}
else
{
strcpy(p_event, (*e)->text.c_str());
p_event += strlen(p_event);
}
p_event++;
}
}
*p_events = '\0';
if (strlen(evtList) + strlen(event) <= EVENT_CACHE)
strcat(evtList,event);
else
break;
p_events = event;
*p_events = '\0';
} // if = serviceID
else if ( serviceIDfound )
break; // sind nach serviceID und startzeit sortiert -> nicht weiter suchen
}
unlockEvents();
if (EITThreadsUnPause())
{
delete[] evtList;
delete[] event;
return ;
}
}
if(strlen(*evtList)<=1) /* für den Fall, das nichts gefunden wurde, ist evtList[0] = '\n' */
{
struct sectionsd::msgResponseHeader responseHeader;
responseHeader.dataLength = strlen(evtList);
dprintf("[sectionsd] all events - response-size: 0x%x\n", responseHeader.dataLength);
if (writeNbytes(connfd, (const char *)&responseHeader, sizeof(responseHeader), WRITE_TIMEOUT_IN_SECONDS) == true)
writeNbytes(connfd, evtList, responseHeader.dataLength, WRITE_TIMEOUT_IN_SECONDS);
else
dputs("[sectionsd] Fehler/Timeout bei write");
}
delete[] evtList;
delete[] event;
return ;
}
hier ein Fix.
Kann zur Zeit leider nicht einchecken, vielleicht tust du es für mich
