/* 9P Protocol JAVA
 * P9P/rcpSrv/rpc9Pwalk.java
 * Autor: Jaime Garzon (2006) jgarzon@gmail.com
 *
 * Esta clase implementa las operaciones de la RPC
 * "walk", que son requeridas por el mensaje tmsg9P
 * Retornando un mensaje de tipo rmsg9P.
*/

package P9P.rpcSrv;

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

public class rpc9Pwalk extends rpc9P {

   Twalk9P tmsg;

   public rpc9Pwalk (Twalk9P m) {
      tmsg = m;
   }

   public rmsg9P process(fidtable fidt) {
      Rwalk9P rmsg = new Rwalk9P();
      pfid qid = fidt.get(tmsg.fid.value);
      pfid nqid = fidt.getNew(tmsg.newfid.value);
      nqid.setFile(qid.getFile());

      if (qid!=null&&nqid!=null) {
         rmsg.wqid = new qid9P[tmsg.nwname.value];
         for(int i=0;i<tmsg.nwname.value;i++) {
            try {
               nqid.setFile(nqid.walk(tmsg.wname[i].value));
            }
            catch (Exception e) {
               fidt.drop(tmsg.newfid.value);
               return returnError("[Twalk]",tmsg.tag,e);
            }
            rmsg.wqid[i]=nqid.getqid();
         }

         rmsg.type.value = cto9P.Rwalk;
         rmsg.tag.value = tmsg.tag.value;
         rmsg.nwqid.value = rmsg.wqid.length;

         return rmsg;
      }
      return returnError("[Twalk] Error NO FID found.",tmsg.tag,null);
   }
}