00001 /************************************************************************** 00002 Copyright (c) 2000-2001, Tony Garnock-Jones 00003 All rights reserved. 00004 00005 Redistribution and use in source and binary forms, with or without 00006 modification, are permitted provided that the following conditions are 00007 met: 00008 00009 * Redistributions of source code must retain the above copyright 00010 notice, this list of conditions and the following disclaimer. 00011 00012 * Redistributions in binary form must reproduce the above 00013 copyright notice, this list of conditions and the following 00014 disclaimer in the documentation and/or other materials provided 00015 with the distribution. 00016 00017 * Neither the names of the copyright holders nor the names of this 00018 software's contributors may be used to endorse or promote 00019 products derived from this software without specific prior 00020 written permission. 00021 00022 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 00023 "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 00024 LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 00025 A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR 00026 CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 00027 EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 00028 PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 00029 PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF 00030 LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 00031 NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 00032 SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 00033 **************************************************************************/ 00034 00035 #include <stdlib.h> 00036 #include <stdio.h> 00037 #include <string.h> 00038 #include <assert.h> 00039 00040 #include <mps/mps.h> 00041 00042 namespace MPS { 00043 00044 vector<string> Server::getBoundNames() const { 00045 vector<string> result; 00046 for (boundNames_t::const_iterator i = boundNames.begin(); 00047 i != boundNames.end(); 00048 i++) { 00049 result.push_back((*i).second); 00050 } 00051 return result; 00052 } 00053 00054 void InterfaceServer::registerMethod(int methodIndex, 00055 string const &methodName, 00056 request_handler_t handler) 00057 { 00058 // We could use /name/ for debug info, later. 00059 while (methods.size() < (unsigned int) methodIndex + 1) 00060 methods.push_back(NULL); 00061 methods[methodIndex] = handler; 00062 } 00063 00064 void InterfaceServer::dispatch(InputStream &request, OutputStream &reply) { 00065 int methodIndex = request.readint(); 00066 00067 if ((unsigned int) methodIndex >= methods.size()) { 00068 char nbuf[40]; 00069 sprintf(nbuf, "%d", methodIndex); 00070 throw MPSException(string("Method number ") + nbuf + " out of range"); 00071 } 00072 00073 request_handler_t handler = methods[methodIndex]; 00074 handler(__impl, request, reply); 00075 } 00076 00077 }