/* Copyright 2010 Nathan Phillip Brink This file is a part of DistRen. DistRen is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. DistRen is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with DistRen. If not, see . */ #ifndef DISTREN_PROTOCOL_H #define DISTREN_PROTOCOL_H #include #include /** Server types: */ #define DISTREN_SERVERTYPE_SUBMIT (0x1) #define DISTREN_SERVERTYPE_DISTRIBUTE (0x2) #define DISTREN_SERVERTYPE_RENDER (0x4) /** This file defines the constants and structs that the client uses to talk to the server and that the servers use to talk to eachother. */ /** generic, shared requests */ enum distren_request_type { /** identifies the version of software being used by the sender and tells if it is a client or server. Just send PACKAGE_STRING. */ DISTREN_REQUEST_VERSION = 1, DISTREN_REQUEST_PING = 2, DISTREN_REQUEST_PONG = 3, /** The data is the a reason describing why the one end is disconnecting. The other end should respectfully close() the socket or the sender will timeout shortly. */ DISTREN_REQUEST_DISCONNECT = 4, /** client->server only requests */ DISTREN_REQUEST_SUBMIT = 5, /** anything->server requests */ DISTREN_REQUEST_JOBINFO = 6, /*< retrieves information about a job based on its number */ /** server->anything */ DISTREN_REQUEST_JOBINFO_RESPONSE = 7, /*< returns information about a job */ /** server->server */ DISTREN_REQUEST_RENDERFRAME = 8, DISTREN_REQUEST_DONEFRAME = 9, /* server should check to make sure the slave is repoting on a frame it's actually assigned to */ DISTREN_REQUEST_PROGRESS = 10, /*< tells another server of the progress of the first server's work at rendering */ DISTREN_REQUEST_GETWORK = 11, DISTREN_REQUEST_GETVERSION = 12, /*< returns version of software that slave should be running */ DISTREN_REQUEST_GETRENDERPOWER = 13, /* returns the render power of a slave */ DISTREN_REQUEST_SETRENDERPOWER = 14, /* sets renderpower in server database */ /** sets a frame back to unassigned, happens if the slave quits for some reason. server code should only allow resetting of a frame assigned to the slave calling the request (see php code) */ DISTREN_REQUEST_RESETFRAME = 15, }; struct distren_request { uint32_t magic; uint32_t len; /** treat type as an enum distren_request_type using casting */ uint32_t /* enum distren_request_type */ type; }; /** * initializes and allocates request */ int distren_request_new(struct distren_request **req, uint32_t len, enum distren_request_type type); struct remoteio; /** Takes a struct distren_request and its associated data, allocates a new block of data to hold the whole packet, and packets the req header and data together. @param rem A remoteio handle to ship this packet off to @param req Something you initialized with distren_request_new(). You are responsible for distren_request_free()ing this yourself. @param data A chunk of data the size of req->len. You are responsible for free()ing this yourself. @return 0 on success and 1 on failure. */ int distren_request_send(struct remoteio *rem, struct distren_request *req, void *data); /** * initializes and allocates request based on raw input data * which includes the headers of the request. */ int distren_request_new_fromdata(struct distren_request **req, void *data, size_t len); /** * frees request */ int distren_request_free(struct distren_request *req); /** * An implementation of remoteio_read_handle_func_t for use with remoteio. * * To use this handler, first initialize a struct distren_request_remoteio_data. * (to be continued... or not...? ;-) ) */ /* size_t distren_request_remoteio_handle(struct remoteio *rem, void *generic_data, void *buf, size_t len, void *data); */ #endif