/* 9P Protocol JAVA
 * P9P/rcpSrv/rpc9P.java
 * Autor: Jaime Garzon (2006) jgarzon@gmail.com
 *
 * Esta clase abstracta relaciona todos los objetos
 * de tipo RPC.
 * El metodo estatico "getrcp", retorna un objeto rcp9P concreto, para
 * un determinado mensaje tmsg9P dado.
 * El metodo returnError(..) retorna un rmsg9P de tipo Rerror9P, usado
 * para retornar posibles errores de las RPC's.
*/

package P9P.rpcSrv;

import java.io.*;

import P9P.msg.*;
import P9P.type.*;
import PFS.*;

public abstract class rpc9P {

   public abstract rmsg9P process(fidtable fidt);

   protected rmsg9P returnError (String s, short9P t, Exception e) {
      Rerror9P rmsg= new Rerror9P();
      String excpmsg="";

      if (e!=null)
         excpmsg = e.getMessage();

      if (excpmsg==null)
         excpmsg="";
      else
         excpmsg = " "+excpmsg;

      rmsg.type.value=cto9P.Rerror;
      rmsg.tag = t;
      rmsg.ename.value = s+excpmsg;

      return rmsg;
   }

   public static rpc9P getrpc (tmsg9P tmsg) {
      switch(tmsg.type.value) {
         case cto9P.Tversion: return new rpc9Pversion((Tversion9P)tmsg);
         case cto9P.Tauth:    return new rpc9Pauth((Tauth9P)tmsg);
         case cto9P.Tattach:  return new rpc9Pattach((Tattach9P)tmsg);
         case cto9P.Twalk:    return new rpc9Pwalk((Twalk9P)tmsg);
         case cto9P.Topen:    return new rpc9Popen((Topen9P)tmsg);
         case cto9P.Tcreate:  return new rpc9Pcreate((Tcreate9P)tmsg);
         case cto9P.Tread:    return new rpc9Pread((Tread9P)tmsg);
         case cto9P.Twrite:   return new rpc9Pwrite((Twrite9P)tmsg);
         case cto9P.Tclunk:   return new rpc9Pclunk((Tclunk9P)tmsg);
         case cto9P.Tremove:  return new rpc9Premove((Tremove9P)tmsg);
         case cto9P.Tstat:    return new rpc9Pstat((Tstat9P)tmsg);
         case cto9P.Twstat:   return new rpc9Pwstat((Twstat9P)tmsg);
         case cto9P.Tflush:   return new rpc9Pflush((Tflush9P)tmsg);
      }
      return null;
   }
}