public void processMsg(ServerMsg m) throws IOException{
    	String tag = m.getTag();
    	tag = tag.trim();
    	
    	threadMessage("Processing Msg " + m.srcID + " " + m.destID + " " + m.tag + " " + m.getMessage());
    	
    	//Messages received as worker
    	if(tag.equals("job_init")){
    		//set server worker object's coordinator ID field
    		mIsWorker = true;
    		mSW.InitJob(m.srcID);
    	}    	
    	else if(tag.equals("job_start")){    		
    		String payload = m.getMessage();
            StringTokenizer st = new StringTokenizer(payload);
            int XCoord = Integer.parseInt(st.nextToken());
            int YCoord = Integer.parseInt(st.nextToken());
            int JobItemID = Integer.parseInt(st.nextToken());
    		
    		try {
				mSW.StartJob(XCoord, YCoord, JobItemID);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
    	}
    	else if(tag.equals("job_stop")){
    		//call mSW.stopProcessing
    		//\todo add a message queue in ServerWorker
    	}
    	else if(tag.equals("job_uninit")){
    		mIsWorker=false;
    	}
    	
    	//Message received as coordinator
    	else if(tag.equals("job_done")){
    		String payload = m.getMessage();
            StringTokenizer st = new StringTokenizer(payload);
            int jobid = Integer.parseInt(st.nextToken());            
            int featMatched = Integer.parseInt(st.nextToken());
            
            int wid = m.getSrcId();
    		mSCoord.JobDone(jobid, wid, featMatched,false);
    		
    	}
    	else if(tag.equals("image_received_ack")){
    		//add to coordinator queue
    		int wid = m.getSrcId();
    		mSCoord.ImageRcvAck(wid);
    	}
    	else if(tag.equals("timeout")){
    		//add to coordinator queue
    		int wid = m.getSrcId();
    		mSCoord.JobDone(0, wid, 0,true);
    	}
    }