示例#1
0
文件: HTTPd.c 项目: Youx/craftd
static
void
cd_JSONRequest (struct evhttp_request* request, CDServer* server)
{
    struct evbuffer* buffer = evhttp_request_get_input_buffer(request);
    char*            text   = CD_alloc(evbuffer_get_length(buffer) + 1);

    evbuffer_remove(buffer, text, evbuffer_get_length(buffer));

    json_error_t error;
    json_t*      input  = json_loads(text, 0, &error);
    json_t*      output = json_object();

    printf("%s\n", text);

    if (evhttp_request_get_command(request) != EVHTTP_REQ_POST) {
        goto error;
    }

    if (input == NULL) {
        SERR(server, "RPC.JSON: error on line %d: %s", error.line, error.text);

        goto error;
    }

    CD_EventDispatch(server, "RPC.JSON", input, output);

done: {
        char*            outString = json_dumps(output, JSON_INDENT(2));
        struct evbuffer* outBuffer = evbuffer_new();

        evbuffer_add_printf(outBuffer, "%s", outString);

        evhttp_send_reply(request, HTTP_OK, "OK", outBuffer);

        evbuffer_free(outBuffer);
        free(outString);
        json_delete(output);
        json_delete(input);
        CD_free(text);

        return;
    }

error: {
        evhttp_send_error(request, HTTP_INTERNAL, "Internal server error");

        CD_free(text);

        if (input) {
            json_delete(input);
        }

        if (output) {
            json_delete(output);
        }

        return;
    }
}
示例#2
0
文件: Workers.c 项目: Youx/craftd
void
CD_DestroyWorkers (CDWorkers* self)
{
    assert(self);

    for (size_t i = 0; i < self->length; i++) {
        CD_StopWorker(self->item[i]);
    }

    pthread_mutex_lock(&self->lock.mutex);
    pthread_cond_broadcast(&self->lock.condition);
    pthread_mutex_unlock(&self->lock.mutex);

    for (size_t i = 0; i < self->length; i++) {
        CD_DestroyWorker(self->item[i]);
    }

    CD_free(self->item);

    CD_DestroyList(self->jobs);

    pthread_mutex_destroy(&self->lock.mutex);
    pthread_cond_destroy(&self->lock.condition);

    CD_free(self);
}
示例#3
0
void
SV_DestroyPacket (SVPacket* self)
{
    assert(self);

    SV_DestroyPacketData(self);

    CD_free((void*) self->data);
    CD_free(self);
}
示例#4
0
文件: Packet.c 项目: Youx/craftd
void
CD_DestroyPacket (CDPacket* self)
{
    assert(self);

    CD_DestroyPacketData(self);

    CD_free((void*) self->data);
    CD_free(self);
}
示例#5
0
void
MC_DestroyMetadata (MCMetadata* self)
{
    for (size_t i = 0; i < self->length; i++) {
        MC_DestroyData(self->item[i]);
    }

    CD_free(self->item);
    CD_free(self);
}
示例#6
0
文件: List.c 项目: fedorms/craftd
static
CDPointer
cd_ListDelete (CDList* self, CDPointer data, CDListCompareCallback callback)
{
    CDPointer result = CDNull;

    assert(self);

    if (!self->head) {
        return CDNull;
    }

    if (callback(data, self->head->value) == 0) {
        CDListItem* item = self->head;
        result           = item->value;
        self->head       = item->next;

        if (self->head) {
            self->head->prev = NULL;
        }

        self->changed = true;

        CD_free(item);
    }
    else {
        CDListItem *item = self->head;

        while (item->next) {
            if (callback(data, item->next->value) == 0) {
                            result     = item->value;
                CDListItem* toDelete   = item->next;
                            item->next = toDelete->next;

                if (item->next) {
                    item->next->prev = item;
                }

                CD_free(toDelete);

                self->changed = true;

                break;
            }
            else {
                item = item->next;
            }
        }
    }

    return result;
}
示例#7
0
文件: String.c 项目: CogDis/craftd
void
CD_DestroyString (CDString* self)
{
	assert(self);

	if (self->external) {
		CD_free(self->raw);
	}
	else {
		bdestroy(self->raw);
	}

	CD_free(self);
}
示例#8
0
文件: Buffer.c 项目: gmoonen/craftd
void
CD_BufferAddBuffer (CDBuffer* self, CDBuffer* data)
{
    CDPointer stuff = CD_BufferContent(data);

    evbuffer_add(self->raw, (void*) stuff, CD_BufferLength(data));

    CD_free((void*) stuff);
}
示例#9
0
文件: main.c 项目: CogDis/craftd
void
cdadmin_DestroyTicket (CDATicket* self)
{
	if (self->content) {
		CD_DestroyString(self->content);
	}

	CD_free(self);
}
示例#10
0
文件: String.c 项目: CogDis/craftd
CDRawString
CD_DestroyStringKeepData (CDString* self)
{
	CDRawString result = self->raw;

	CD_free(self);

	return result;
}
示例#11
0
文件: Buffer.c 项目: gmoonen/craftd
void
CD_DestroyBuffer (CDBuffer* self)
{
    if (!self->external) {
        evbuffer_free(self->raw);
    }

    CD_free(self);
}
示例#12
0
void
MC_DestroyData (MCData* self)
{
    // Destroy the bstring, the other types lay on the stack
    if (self->type == MCTypeString) {
        CD_DestroyString(self->data.S);
    }

    CD_free(self);
}
示例#13
0
文件: String.c 项目: CogDis/craftd
static inline
void
cd_MakeStringInternal (CDString* self)
{
	if (!self->external) {
		return;
	}

	bstring data = bstrcpy(self->raw);

	CD_free(self->raw);
	self->raw      = data;
	self->external = false;
}
示例#14
0
文件: Worker.c 项目: Youx/craftd
void
CD_DestroyWorker (CDWorker* self)
{
    assert(self);

    if (self->thread) {
        self->working = false;
        pthread_join(self->thread, NULL);
    }

    if (self->job) {
        CD_DestroyJob(self->job);
    }

    CD_free(self);
}
示例#15
0
文件: List.c 项目: fedorms/craftd
static
void
cd_ListSortInsert (CDList* self, CDListCompareCallback callback)
{
    CDListItem* walker = self->head;

    self->head = NULL;
    self->tail = NULL;

    while (walker) {
        CDListItem* toDestroy = walker;

        cd_ListInsertSorted(self, walker->value, callback);

        walker = walker->next;

        CD_free(toDestroy);
    }
}
示例#16
0
文件: Client.c 项目: CogDis/craftd
void
CD_DestroyClient (CDClient* self)
{
	assert(self);

	CD_EventDispatch(self->server, "Client.destroy", self);

	if (self->buffers) {
		bufferevent_flush(self->buffers->raw, EV_READ | EV_WRITE, BEV_FINISHED);
		bufferevent_disable(self->buffers->raw, EV_READ | EV_WRITE);
		bufferevent_free(self->buffers->raw);

		CD_DestroyBuffers(self->buffers);
	}

	CD_DestroyDynamic(DYNAMIC(self));

	pthread_rwlock_destroy(&self->lock.status);

	CD_free(self);
}
示例#17
0
void
SV_DestroyPacketData (SVPacket* self)
{
    if (!self->data) {
        return;
    }

    switch (self->chain) {
        case SVRequest: {
            switch (self->type) {
                case SVLogin: {
                    SVPacketLogin* packet = (SVPacketLogin*) self->data;

                    SV_DestroyString(packet->request.username);
                } break;

                case SVHandshake: {
                    SVPacketHandshake* packet = (SVPacketHandshake*) self->data;

                    SV_DestroyString(packet->request.username);
                } break;

                case SVChat: {
                    SVPacketChat* packet = (SVPacketChat*) self->data;

                    SV_DestroyString(packet->request.message);
                } break;

                case SVEntityMetadata: {
                    SVPacketEntityMetadata* packet = (SVPacketEntityMetadata*) self->data;

                    SV_DestroyMetadata(packet->request.metadata);
                } break;

                case SVUpdateSign: {
                    SVPacketUpdateSign* packet = (SVPacketUpdateSign*) self->data;

                    SV_DestroyString(packet->request.first);
                    SV_DestroyString(packet->request.second);
                    SV_DestroyString(packet->request.third);
                    SV_DestroyString(packet->request.fourth);
                } break;

                case SVDisconnect: {
                    SVPacketDisconnect* packet = (SVPacketDisconnect*) self->data;

                    SV_DestroyString(packet->request.reason);
                }

                default: break;
            }
        } break;

        case SVResponse: {
            switch (self->type) {
                case SVLogin: {
                    SVPacketLogin* packet = (SVPacketLogin*) self->data;

                    SV_DestroyString(packet->response.serverName);
                } break;

                case SVHandshake: {
                    SVPacketHandshake* packet = (SVPacketHandshake*) self->data;

                    SV_DestroyString(packet->response.hash);
                } break;

                case SVChat: {
                    SVPacketChat* packet = (SVPacketChat*) self->data;

                    SV_DestroyString(packet->request.message);
                } break;

                case SVNamedEntitySpawn: {
                    SVPacketNamedEntitySpawn* packet = (SVPacketNamedEntitySpawn*) self->data;

                    SV_DestroyString(packet->response.name);
                } break;

                case SVSpawnMob: {
                    SVPacketSpawnMob* packet = (SVPacketSpawnMob*) self->data;

                    SV_DestroyMetadata(packet->response.metadata);
                } break;

                case SVPainting: {
                    SVPacketPainting* packet = (SVPacketPainting*) self->data;

                    SV_DestroyString(packet->response.title);
                } break;

                case SVEntityMetadata: {
                    SVPacketEntityMetadata* packet = (SVPacketEntityMetadata*) self->data;

                    SV_DestroyMetadata(packet->response.metadata);
                } break;

                case SVMapChunk: {
                    SVPacketMapChunk* packet = (SVPacketMapChunk*) self->data;

                    CD_free(packet->response.item);
                } break;

                case SVMultiBlockChange: {
                    SVPacketMultiBlockChange* packet = (SVPacketMultiBlockChange*) self->data;

                    CD_free(packet->response.coordinate);
                    CD_free(packet->response.type);
                    CD_free(packet->response.metadata);
                } break;

                case SVExplosion: {
                    SVPacketExplosion* packet = (SVPacketExplosion*) self->data;

                    CD_free(packet->response.item);
                } break;

                case SVOpenWindow: {
                    SVPacketOpenWindow* packet = (SVPacketOpenWindow*) self->data;

                    SV_DestroyString(packet->response.title);
                } break;

                case SVWindowItems: {
                    SVPacketWindowItems* packet = (SVPacketWindowItems*) self->data;

                    CD_free(packet->response.item);
                } break;

                case SVDisconnect: {
                    SVPacketDisconnect* packet = (SVPacketDisconnect*) self->data;

                    SV_DestroyString(packet->response.reason);
                } break;

                default: break;
            }
        } break;
    }
}
示例#18
0
文件: Event.c 项目: gmoonen/craftd
void
CD_DestroyEventCallback (CDEventCallback* self)
{
    CD_free(self);
}
示例#19
0
文件: Event.c 项目: CogDis/craftd
	CD_LIST_FOREACH(parameters, it) {
		CD_free((char*) CD_ListIteratorValue(it));
	}