// This file is part of the Noddybox.WindowsPhone C# suite. // // Noddybox.Emulation is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Noddybox.Emulation is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with Noddybox.Emulation. If not, see . // // Copyright (c) 2012 Ian Cowburn // using System; using System.Net; using System.Net.Sockets; using System.IO; using System.Text; using System.Text.RegularExpressions; namespace Noddybox.WindowsPhone.Net { /// /// Provides a wrapper around a stream to interact with servers /// public class ServerDialog { // ------------------------------------------------- // - PUBLIC MEMBERS - // ------------------------------------------------- /// /// Used for returns from the server /// public class Reply { /// /// Default constructor - initializes all fields to default values /// public Reply() { m_code=-1; m_text=""; } /// /// The code returned by the server /// public int Code { get {return m_code;} set {m_code=value;} } /// /// The text returned by the server /// public string Text { get {return m_text;} set {m_text=value;} } private int m_code; private string m_text; } /// /// Default constructor - initializes all fields to default values /// public ServerDialog() { m_encode=new System.Text.ASCIIEncoding(); m_code=new Regex("^[0-9][0-9][0-9]"); m_code_end=new Regex("^[0-9][0-9][0-9][^-]"); } /// /// Sends a command to the server and returns the reply /// public Reply Send(Stream str, string command) { Reply r=new Reply(); if (command!=null) { byte[] b=ToBytes(command); str.Write(b,0,b.Length); } GetResult(str,r); return r; } // ------------------------------------------------- // - PRIVATE MEMBERS - // ------------------------------------------------- private ASCIIEncoding m_encode; private Regex m_code; private Regex m_code_end; private byte[] ToBytes(string s) { return m_encode.GetBytes(s); } private string GetLine(Stream str) { byte[] b=new byte[1]; int c; string r=""; while((c=str.ReadByte())!=-1) { b[0]=(byte)c; r+=m_encode.GetString(b); if (c==10) { break; } } return r; } private void GetResult(Stream str, Reply r) { string s; string all=""; bool first_line=true; do { s=GetLine(str); if (first_line) { if (m_code.IsMatch(s)) { r.Code=Convert.ToInt32(s.Substring(0,3)); } else { throw new NetException(NetException.Type.ALL_NoReplyCode); } first_line=false; } if (m_code.IsMatch(s)) { all+=s.Substring(4); } else { all+=s; } } while (!m_code_end.IsMatch(s)); all=all.TrimEnd(null); r.Text=all; } } }