using System.Web;
using System.Web.Services;
using System.Web.Services.Protocols;
using System;                         // Niezbdne dla klasy String.
using System.EnterpriseServices;      // Niezbdne dla transakcji.
using System.Collections;             // Niezbdne dla obiektu ArrayLists.
using System.Data;                    // Niezbdne dla obiekt DataSet.
using System.Data.SqlClient;          // Niezbdne dla obiektu DataSet.

[WebService (Description="Program pobierania kursw akcji, napisany w jzyku C#.",
   Name="StockTicker",
   Namespace="www.LibertyAssociates.com")]

[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1,
   EmitConformanceClaims = true)]
[WebServiceBinding(Name = "OverloadedGetValue",
   ConformsTo = WsiProfiles.BasicProfile1_1,
   EmitConformanceClaims = true)]
public class Service : System.Web.Services.WebService
{
   // Konstruujemy i wypeniamy tablic symboli giedowych oraz ich cen.
   // Uwaga: ceny dotycz giedy w USA z  dnia 01/5/2005.
   string[,] stocks =
   {
      {"MSFT","Microsoft","25.30"},
      {"DELL","Dell Computers","34.83"},
      {"HPQ","Hewlett Packard","20.47"},
      {"YHOO","Yahoo!","34.50"},
      {"GE","General Electric","36.20"},
      {"IBM","International Business Machine","76.38"},
      {"GM","General Motors","26.68"},
      {"F","Ford Motor Company","9.11"}
   };

   [WebMethod(Description="Zwraca cen waloru dla podanego symbolu giedowego.")]
   public double GetPrice(string StockSymbol)
   // Podajemy symbol giedowy, otrzymujemy cen waloru.
   {
      // Przegldamy elementy tablicy w poszukiwaniu symbolu.
      for (int i = 0; i < stocks.GetLength(0); i++)
      {
         // Przeprowadzamy porwnanie cigw tekstowych bez rozrniania maych i duych liter.
         if (String.Compare(StockSymbol, stocks[i,0], true) == 0)
            return Convert.ToDouble(stocks[i,2]);
      }
      return 0;
   }

   [WebMethod(Description="Zwraca nazw waloru dla podanego symbolu giedowego.")]
   public string GetName(string StockSymbol)
   // Podajemy symbol giedowy, otrzymujemy nazw waloru.
   {
      // Przegldamy elementy tablicy w poszukiwaniu symbolu.
      for (int i = 0; i < stocks.GetLength(0); i++)
      {
         // Przeprowadzamy porwnanie cigw tekstowych bez rozrniania maych i duych liter.
         if (String.Compare(StockSymbol, stocks[i,0], true) == 0)
            return stocks[i,1];
      }
      return "Symbol nie zosta znaleziony.";
   }

   [WebMethod]
   public void SetStockExchange(string Exchange)
   {
      Application["exchange"] = Exchange;
   }

   [WebMethod]
   public string GetStockExchange()
   {
      return Application["exchange"].ToString();
   }

   [WebMethod(Description = "Liczba odwiedzin w czasie trwania sesji.",
      EnableSession = true)]
   public int HitCounter()
   {
      if (Session["HitCounter"] == null)
      {
         Session["HitCounter"] = 1;
      }
      else
      {
         Session["HitCounter"] = ((int)Session["HitCounter"]) + 1;
      }
      return ((int)Session["HitCounter"]);
   }

   [WebMethod(Description="Zwraca warto akcji uytkownika " +
      " o okrelonym symbolu giedowym.",
      MessageName="GetValuePortfolio")]
   public double GetValue(string StockSymbol)
   {
      /* Miejsce na kod pobierajcy od biecego uytkownika nazw uytkownika,
         a nastpnie zwracajcy zarwno aktualn cen podanego waloru, jak rwnie
         liczb akcji posiadanych przez biecego uytkownika. Obie wartoci s 
pomnoone, a nastpnie zostaje zwrcony wynik.
      */
      return 0;
   }

   [SoapDocumentMethod(Binding = "OverloadedGetValue")]
   [WebMethod(Description="Ta metoda zwraca warto " +
      "okrelonej liczby akcji o danym symbolu giedowym.",
      MessageName="GetValueStock")]
   public double GetValue(string StockSymbol, int NumShares)
   {
      /* Miejce na umieszczenie kodu, ktry pobiera biec cen waloru o podanym
         symbolu giedowym, a nastpnie mnocym przez warto NumShares
         i zwracajcym wynik.
      */
      return 0;
   }

   [WebMethod(Description="Ta metoda ustawia warto akcji uytkownika " +
      " o danym symbolu giedowym.",
      TransactionOption=TransactionOption.RequiresNew)]
   public double SetValue(string StockSymbol)
   {
      /*  Miejsce na umieszczenie kodu, ustawiajcego warto 
         na podstawie danego symbolu giedowego - StockSymbol.
         Ta metoda rozpoczyna now transakcj.
      */
      return 0;
   }

   [WebMethod(Description="Zwraca wszystkie symbole giedowe, ktrych nazwy firm " +
      "zostay dopasowane do podanego cigu tekstowego jako *str*.")]
   public ArrayList GetList(string MatchString)
   {
      ArrayList a = new ArrayList();

      // Przegld elementw tablicy i odszukanie pasujcych nazw firm.
      for (int i = 0; i < stocks.GetLength(0); i++)
      {
         // Wielko liter ma znaczenie w trakcie wyszukiwania.
         if (stocks[i,1].ToUpper().IndexOf(MatchString.ToUpper()) >= 0)
            a.Add(stocks[i,1]);
      }
      a.Sort();
      return a;
   }

   [WebMethod(Description="Zwraca zbir danych z bazy danych Northwind.")]
   public DataSet GetDataset()
   {
      // Poczenie z baz danych Northwind.
      string connectionString =
         "server=MojSerwer; uid=uzytkownik;pwd=haslo;database= Northwind";

      // Pobieramy rekordy z tabeli Customers.
      string commandString =
         "Select CompanyName,ContactName, City, Country from Customers";

      // Tworzymy obiekt Command zbioru danych oraz obiekt DataSet.
      SqlDataAdapter dataAdapter = new SqlDataAdapter(commandString,
         connectionString);

      DataSet dataSet = new DataSet();

      // Wypeniamy danymi obiekt DataSet.
      dataAdapter.Fill(dataSet,"Customers");

      return dataSet;
   }

   [WebMethod(Description="Zwraca histori notowa giedowych " +
      "na podstawie podanego symbolu giedowego.")]
   public Stock GetHistory(string StockSymbol)
   {

      Stock stock = new Stock();

      // Przegldamy elementy tablicy w poszukiwaniu symbolu.
      for (int i = 0; i < stocks.GetLength(0); i++)
      {
         // Przeprowadzamy porwnanie cigw tekstowych, bez rozrniania wielkoci liter.
         if (String.Compare(StockSymbol, stocks[i,0], true) == 0)
         {
            stock.StockSymbol = StockSymbol;
            stock.StockName = stocks[i,1];
            stock.Price = Convert.ToDouble(stocks[i,2]);
            stock.Broker = "Dewy, Cheatum, & Howe";

            // Wypeniamy dane StockHistory.
            stock.History[0] = new StockHistory();
            stock.History[0].TradeDate = Convert.ToDateTime("01/5/2005");
            stock.History[0].Price = Convert.ToDouble(23.25);

            stock.History[1] = new StockHistory();
            stock.History[1].TradeDate = Convert.ToDateTime("01/6/2005");
            stock.History[1].Price = Convert.ToDouble(28.75);

            return stock;
         }
      }
      stock.StockSymbol = StockSymbol;
      stock.StockName = "Walor nie zosta znaleziony.";
      return stock;
   }
} // Koniec klasy Service.

public class Stock
{
   public string StockSymbol;
   public string StockName;
   public double Price;
   public StockHistory[] History =
         new StockHistory[2];

   private string strBroker;
   public string Broker
   {
      get
      {
         return strBroker;
      }
      set
      {
         strBroker = value;
      }
   }
}

public class StockHistory
{
   public DateTime TradeDate;
   public double Price;
}
