private void ProcessRequest(Request req, out ReturnRequest retreq, out SynchronizeRequest syncreq)
            {
                AuthImplement authimplement = new AuthImplement(m_AuthManager);
                string token = "";
                DateTime exptime = DateTime.Now;
                bool result = false;
                AuthResult authret = new AuthResult();

                switch (req.m_RequestType) {
                    case RequestType.Authenticate:
                        authret = authimplement.Authenticate(req.m_Username, req.m_Password, out token);
                        authimplement.Validate(token, out exptime);
                        req.m_Token = token;
                        break;
                    case RequestType.CreateUser:
                        authret = authimplement.CreateUser(req.m_Username, req.m_Password, token);
                        break;
                    case RequestType.IsAdmin:
                        break;
                    case RequestType.Validate:
                        result = authimplement.Validate(req.m_Token, out exptime);
                        break;
                }
                
                // Make the ReturnRequest and SynchronizeRequest object
                retreq = new ReturnRequest(authret, token, exptime, result, req.m_Signature);
                syncreq = new SynchronizeRequest(req, m_ID, exptime);
            }
 // Call this function only with am locked
 private void ProcessSynchronizeRequest(AuthManager am, SynchronizeRequest syncreq)
 {
     Request req = syncreq.m_Request;
     string msg = "";
     switch (req.m_RequestType)
     {
         // If we created a new user, just call the Register function
         case RequestType.CreateUser:
             am.Register(req.m_Username, req.m_Password, out msg);
             break;
         // If we generate a token for a user, we need to create this token for other co-existing authservers
         case RequestType.Authenticate:
             am.AddSynchronizedToken(req.m_Token, req.m_Username, syncreq.m_ExpTime);
             break;
         default:
             break;
     }
 }