// With version 1.6.7 and above, the UPNP library maintainers made a questionable // API choice to register the callbacks one-by-one, instead of having a // struct with the callbacks which is certainly a better and 'typical' C API // choice. They removed the UpnpVirtualDirCallbacks in the course of that. // Because it breaks code, it has been reverted in version 1.6.16 // (see http://sourceforge.net/p/pupnp/bugs/29/ ), but we essentially have a // broken version between 1.6.7 ... 1.6.16. // Assuming that they will go on with this broken idea and eventually remove // the support for the VirtualDirCallbacks in new major versions, we use the // newer (may I emphasize: questionable) API to register the callbacks. gboolean webserver_register_callbacks(void) { gboolean result = (UpnpVirtualDir_set_GetInfoCallback(webserver_get_info) == UPNP_E_SUCCESS && UpnpVirtualDir_set_OpenCallback(webserver_open) == UPNP_E_SUCCESS && UpnpVirtualDir_set_ReadCallback(webserver_read) == UPNP_E_SUCCESS && UpnpVirtualDir_set_WriteCallback(webserver_write) == UPNP_E_SUCCESS && UpnpVirtualDir_set_SeekCallback(webserver_seek) == UPNP_E_SUCCESS && UpnpVirtualDir_set_CloseCallback(webserver_close) == UPNP_E_SUCCESS); return result; }
ERROR_TYPE IUpnp::SetVirtualDirCallbacks(IN UpnpVirtualDirCallbacks *callbacks) { //return (ERROR_TYPE)UpnpSetVirtualDirCallbacks(callbacks); UpnpVirtualDir_set_GetInfoCallback(callbacks->get_info); UpnpVirtualDir_set_OpenCallback(callbacks->open); UpnpVirtualDir_set_ReadCallback(callbacks->read); UpnpVirtualDir_set_WriteCallback(callbacks->write); UpnpVirtualDir_set_SeekCallback(callbacks->seek); UpnpVirtualDir_set_CloseCallback(callbacks->close); return (ERROR_TYPE)0; }