module DVD {
  typedef string datec;
// IDL jest podzielony na kilka interfejsów:
//    MEMBERSHIP   - do obsługi zbioru klientów wypożyczalni
//    TITLING      - do obsługi _dostępnych_ tytułów płyt
//    DISKS        - do obsługi zbioru fizycznych płyt DVD, które są
//                   dostępne do wypożyczenia
//    RENTAL       - obsługa transakcji wypożyczania płyt
//    RESERVATIONS - obsługa rezerwacji tytułów na przyszłość
//    UTILITIES    - niektóre operacje pomocnicze
//    FACTORY      - interfejs zapewniający możliwość odwoływania się
//                   do innych interfejsów

// Metody używane do obsługi klientów wypożyczalni
  interface MEMBERSHIP { 
    exception NOSUCHMEMBER {};
    // Wewnętrzna reprezentacja jest typu long integer
    typedef long memberidt;    
   
    // memberidList użyto w tym celu, aby operatory mogły zwracać
    // listę klientów wypożyczalni
    typedef sequence<memberidt> memberidList;

    // Infromacja o każdym kliencie:
    struct storemembers  {
      memberidt memberid;      /* wewnętrzny id [1..] */
      string memberno;         /* numer klienta, którym się on posługuje */
      string title;            /* Mr Mrs Ms Dr Sir */
      string fname;            /* imię */
      string lname;            /* nazwisko */
      string houseflatref;     /* np. 5 lub 'The birches' itd. */
      string address1;         /* pierwszy wiersz adresu */
      string address2;         /* drugi wiersz adresu */
      string town;             /* miejscowość */
      string state;            /* stan - wymagany tylko w USA */
      string phone;            /* nr telefonu w postaci +44(0)123 456789 */
      string zipcode;          /* LE1 1AA lub kod pocztowy innego rodzaju */
    };

    // The operators allow creating, deleting, getting, and setting
    // values for a member.
    void set(in storemembers recordtoupdate);
    void get(in memberidt memberid,
             out storemembers recordtocomplete)
      raises (NOSUCHMEMBER);
    void create (in storemembers recordtoadd, 
                 out memberidt memberid);
    void delete (in memberidt memberid) 
      raises (NOSUCHMEMBER);

    // If you search for a surname, you get back a list of matching
    // members.
    void search (in string lname, 
                 out memberidList resultids);
    // idfromnumber przekształaca "publiczny" numer klienta na wartości
    // używane wewnętrznie.
    void idfromnumber (in string memberno, 
                       out memberidt memberid)
      raises (NOSUCHMEMBER);
  }; 
 
  // Metody używane do przetwarzania tytułów filmów
  interface TITLING {
    exception NOSUCHTITLE {};
    exception NOSUCHGENRE {};
    typedef string classif;
    typedef sequence<classif> classList;
    typedef string genres ;
    typedef sequence<genres> genreList;
    typedef long titlet;
    typedef sequence<titlet> titleList;
    struct dvdtitles {
      titlet titleid;         /* wewnętrzny ID [1..] */
      string titletext;       /* np. 'Milczenie owiec' */
      string asin;            /* 10-cyfrowy numer katalogowy */
      string director;        /* nazwisko reżysera */
      genres genre;           /* rodzaj, np. 'Horror', 'comedy' itd.
                                 API dla standardowej listy dalej */
      classif classification;
      string actor1;          /* np. 'Jeremy Irons' */
      string actor2;          /* np. 'Ingmar Bergman' */
      datec releasedate;      /* data YYYYMMDD plus null */
      string rentalcost;      /* cena za dzień wypożyczenia 
                                 w formacie $$$.cc */
    };
    // Note that set, get, create, delete, and search are reused in
    // the TITLING namespace.  They will be used again in later
    // interfaces as well.
    void set (in dvdtitles recordtoupdate);
    void get (in titlet titleid, 
              out dvdtitles recordtocomplete) 
      raises (NOSUCHTITLE);
    void create (in dvdtitles recordtoadd, 
                 out titlet titleid);
    void delete (in titlet titleid) 
      raises (NOSUCHTITLE);
    void search (in string title, in string name, 
                 out titleList resultids);
  };
  // Metody używane do przetwarzania danych o płytach DVD
  // 
  // A "disk" is an actual physical DVD that the store has in stock
  // that could be rented out to a member.  Seven copies of "Seven
  // Samurai", and such.
  interface DISKS { 
    exception NOSUCHDISK {};
    typedef long dvdidt;
    typedef sequence<dvdidt> dvdList;
    struct dvddisks {
      dvdidt diskid;   /* wewnętrzny ID [1..] (nie powiązany z title_id) */
      TITLING::titlet titleid;  
    } ;
    // Zwróćmy uwagę na powtórne użycie tych samych nazw operatorów:
    // set/get/create/delete 
    void    set (in dvddisks recordtoupdate);
    void    get (in dvdidt diskid, 
                 out dvddisks recordtocomplete)
      raises (NOSUCHDISK);
    void    create (in dvddisks recordtoadd, 
                    out dvdidt diskid);
    void    delete (in dvdidt diskid) 
      raises (NOSUCHDISK);
    void    search (in TITLING::titlet titleid, 
                    out dvdList resultids);
  };

  // The RENTAL and RESERVATIONS interfaces provide rather more
  // complex operators that are descriptive of what is done with a
  // title.
  interface RENTAL { // Metody używane do obsługi wypożyczeń i zwrotów
    exception FORBIDDENRATING {}; // Dzieci nie mogą wypożyczać pornografii
    void renttitle (in MEMBERSHIP::memberidt memberid, 
                    in TITLING::titlet titleid,
                    out DISKS::dvdidt diskid) 
      raises (DISKS::NOSUCHDISK, MEMBERSHIP::NOSUCHMEMBER, 
              TITLING::NOSUCHTITLE, FORBIDDENRATING);
    void rentdiskinfo (in DISKS::dvdidt diskid, 
                       out MEMBERSHIP::memberidt memberid, 
                       out datec daterented)
      raises (DISKS::NOSUCHDISK);
    void diskreturn (in DISKS::dvdidt diskid, 
                     in datec returndate, 
                     out MEMBERSHIP::memberidt memberid)
      raises (DISKS::NOSUCHDISK);
    long titleavailable (in TITLING::titlet titleid, in datec date)
      raises (TITLING::NOSUCHTITLE);
    void overduedisks (in datec fromdate, in datec todate,
                       out DISKS::dvdList latedisks);
  };
  interface RESERVATIONS { // Metody używane do rezerwacji tytułów
    void reservetitle (in datec needed, in TITLING::titlet titleid,
                       in MEMBERSHIP::memberidt memberid)
      raises (TITLING::NOSUCHTITLE, MEMBERSHIP::NOSUCHMEMBER, 
              RENTAL::FORBIDDENRATING);
    void cancelreservation (in MEMBERSHIP::memberidt memberid)
      raises (MEMBERSHIP::NOSUCHMEMBER);
    void queryreservationbymember (in MEMBERSHIP::memberidt memberid, 
                                      out TITLING::titlet titleid)
      raises (MEMBERSHIP::NOSUCHMEMBER);
    void queryreservationbytitle (in TITLING::titlet titleid, 
                                     in datec date,
                                  out MEMBERSHIP::memberidList memberids)
      raises (TITLING::NOSUCHTITLE);
  };
  // Metody dodatkowe, nie wiążące się z innymi
  interface UTILITIES { 
    void getgenres(out TITLING::genreList genrelist);
    void getclassifications (out TITLING::classList classlist);
    void errtext(in long errnumber, out string messagetoshow);
    void today(out datec date); 
    // Time _could_ be managed via the Time Service, but our needs
    // here are pretty simple
  };
  // Interfejs podstawowy zapewniający dostęp do innych.
  // It represents the "bootstrap" for the system.
  // We could change the way the system is distributed
  // by changing the way these interfaces are returned.
  interface FACTORY {
    MEMBERSHIP MEMBERSHIPFactory ();
    TITLING TITLINGFactory ();
    DISKS DISKSFactory ();
    RENTAL RENTALFactory ();
    RESERVATIONS RESERVATIONSFactory ();
    UTILITIES UTILITIESFactory ();
 };
};
