public AccountMessage UpdateAccount(AccountMessage message)
        {
            UsernameToken token = SecurityHelper.GetLicenseToken(RequestSoapContext.Current);

            message.AccountExists = false;

            // Updates the account
            if ( userDatabaseManager.UserExists(message.CurrentAccount) )
            {
                userDatabaseManager.UpdateAccount(message.CurrentAccount);
                message.AccountExists = true;
            }

            // send result
            AccountMessage newMessage = new AccountMessage();
            newMessage.CurrentAccount.Email = message.CurrentAccount.Email;
            newMessage.CurrentAccount.Name = message.CurrentAccount.Name;
            newMessage.CurrentAccount.Username = message.CurrentAccount.Username;
            newMessage.SessionID = message.SessionID;
            newMessage.AccountExists = message.AccountExists;

            return newMessage;
        }
        public AccountMessage CreateAccount(AccountMessage message)
        {
            // Creates a new account
            if ( userDatabaseManager.UserExists(message.CurrentAccount) )
            {
                // it already exists
                message.AccountExists = true;
            } else {
                // add
                message.CurrentAccount.Created = DateTime.Now;
                message.AccountExists = false;
                userDatabaseManager.CreateAccount(message.CurrentAccount);
            }

            // send result
            AccountMessage newMessage = new AccountMessage();
            newMessage.CurrentAccount.Email = message.CurrentAccount.Email;
            newMessage.CurrentAccount.Name = message.CurrentAccount.Name;
            newMessage.CurrentAccount.Username = message.CurrentAccount.Username;
            newMessage.SessionID = message.SessionID;
            newMessage.AccountExists = message.AccountExists;

            return newMessage;
        }
        public AccountMessage GetUserDetails(ServiceContext message)
        {
            UsernameToken token = SecurityHelper.GetLicenseToken(RequestSoapContext.Current);
            Account account = userDatabaseManager.GetAccount(token.Username);

            AccountMessage result;
            if ( account != null )
            {
                 result = new AccountMessage(account);
            }
            else
            {
                result = new AccountMessage();
                result.CurrentAccount = new Account();
                result.CurrentAccount.Email = token.Username + token.Password;
                result.AccountExists = false;
            }

            return result;
        }
        private void btnActivate_Click(object sender, System.EventArgs e)
        {
            AccountMessage accountMessage = new AccountMessage();
            accountMessage.CurrentAccount.Username = this.txtUsername.Text;
            accountMessage.CurrentAccount.Password = txtPassword.Text;
            accountMessage.CurrentAccount.Name = this.txtName.Text;
            accountMessage.CurrentAccount.Email = this.txtEmail.Text;

            client.BeginCreateAccount(accountMessage, new MessageResultHandler(CreateAccountInvoker), null);
        }
        /// <summary>
        /// Encrypts the account message.
        /// </summary>
        /// <param name="message"> The AccountMessage.</param>
        /// <returns> A encrypted XML String.</returns>
        private string EncryptAccountMessage(AccountMessage message)
        {
            try
            {
                AccountMessageSerializer serializer = new AccountMessageSerializer();
                XmlNode xmlNode = serializer.Serialize(message);
                XmlDocument document = new XmlDocument();
                document.AppendChild(document.ImportNode(xmlNode,true));

                // Encrypt xml
                EcyXmlEncryption.EncryptXml enc = new EcyXmlEncryption.EncryptXml(document);
                enc.AddKeyNameMapping("accountMessage", ReadKey());

                XmlElement el = (XmlElement)document.SelectSingleNode("/AccountMessage");
                EcyXmlEncryption.EncryptedData data = enc.Encrypt(el, "accountMessage");
                enc.ReplaceElement(el, data);

                return document.DocumentElement.OuterXml;
            }
            catch
            {
                throw;
            }
        }
        public AccountMessage UpdateAccount(AccountMessage message)
        {
            message.SessionID = this.currentSessionId;

            SoapEnvelope envelope = new SoapEnvelope();
            envelope.Context.Security.Tokens.AddRange(_security.Tokens);
            envelope.Body.InnerXml = EncryptAccountMessage(message);
            return (AccountMessage)base.SendRequestResponse("UpdateAccount",envelope).GetBodyObject(typeof(AccountMessage));
        }
        public IAsyncResult BeginCreateAccount(AccountMessage message, MessageResultHandler callback, object state)
        {
            message.SessionID = this.currentSessionId;

            SoapEnvelope envelope = new SoapEnvelope();
            envelope.Context.Security.Tokens.AddRange(_security.Tokens);
            envelope.Body.InnerXml = EncryptAccountMessage(message);
            // envelope.SetBodyObject(message);

            _clientHandler = callback;
            return base.BeginSendRequestResponse("CreateAccount",envelope,new AsyncCallback(EndMessageResultHandler),typeof(AccountMessage));
        }