/*
* Copyright (c) 2006 Manuel Traut and Volker Dahnke
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Common Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/cpl-v10.html
*
* Contributors: Manuel Traut and Volker Dahnke
*/
package YalpClients.SwtClient;
import YalpInterfaces.*;
import YalpClients.*;
import java.beans.XMLDecoder;
import java.beans.XMLEncoder;
import java.io.*;
import java.net.Inet4Address;
import java.net.MalformedURLException;
import java.net.UnknownHostException;
import java.sql.SQLException;
import java.util.ArrayList;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.MessageBox;
import org.eclipse.swt.widgets.Shell;
import org.omg.CosNaming.*;
import org.omg.CosNaming.NamingContextPackage.*;
import org.omg.CORBA.*;
/*
* Class Model
*
* Implementiert die Schnittstellenfunktionen zur Steuerung des Servers
* (Datenbankinhalte schreiben, lesen; Streaming steuern
*
* @author Volker Dahnke / Manuel Traut
*
* @version 0.6 14-12-2005
*
* @see client.GUI
*/
public class Model {
public ServerControlInterface srvCon;
private Process vlcPlayer;
private Output actualStream = new Output();
private Output streamInfo = new Output();
private ArrayList findMedia = new ArrayList();
private ArrayList editMedia = new ArrayList();
private ArrayList toPlaylist = new ArrayList();
private ArrayList playList = new ArrayList();
private ArrayList userList = new ArrayList();
private ClientConfiguration settings;
private String clientIP;
private String curPasswd;
private AccessRights userGroup=AccessRights.DENY;
private String userName;
private Boolean playback = false;
private Boolean logoff= false;
private Session session = new Session();
/*
* Instances srvConnection to Registry, DbConnection, ServerControl
* and VlcStreamer. Also instances Class variables
*/
public Model(String[] argv) {
this.settings=new ClientConfiguration();
loadConfig("ClientConfiguration.xml");
writeConfig("ClientConfiguration.xml");
try {
ORB orb = ORB.init(argv, null);
org.omg.CORBA.Object objRef =
orb.resolve_initial_references("NameService");
NamingContextExt ncRef = NamingContextExtHelper.narrow(objRef);
String name = "YALP_Server";
srvCon = ServerControlInterfaceHelper.narrow(ncRef.resolve_str(name));
} catch (Exception e) {// DEBUG
String errorStr="couldn't connect to YALP Server";
MessageBox messageBox = new MessageBox(
new Shell(Display.getDefault(),SWT.MIN), SWT.OK );
System.out.println(e);
messageBox.setMessage(errorStr);
messageBox.open();
System.exit(0);
}
// determine client IP Adress
try {
this.clientIP = Inet4Address.getLocalHost().getHostAddress();
System.out.println(this.clientIP);
} catch (UnknownHostException e) {
String errorStr = "Model.model: determine IP failed";
MessageBox messageBox = new MessageBox(
new Shell(Display.getDefault(),SWT.MIN), SWT.OK );
System.out.println(errorStr);
messageBox.setMessage(errorStr);
messageBox.open();
System.exit(0);
}
this.userList = new ArrayList();
this.playList = new ArrayList();
this.toPlaylist = new ArrayList();
}
/*
* write Configuration to XML File
*
* @param fileName
* @return boolean: true if succesful
*/
public boolean writeConfig(String fileName) {
try {
FileOutputStream srvConfigFile = new FileOutputStream(fileName);
XMLEncoder srvConfigWriter = new XMLEncoder(srvConfigFile);
srvConfigWriter.writeObject(settings.serverIP);
srvConfigWriter.writeObject(settings.classServerPort);
srvConfigWriter.writeObject(settings.registryPort);
srvConfigWriter.writeObject(settings.vlcCommand);
srvConfigWriter.close();
} catch (FileNotFoundException fnfe) {
return false;
}
return true;
}
/*
* load Configuration from XML File if possible
*
* @param fileName
* @return boolean: true if succesful
*/
public boolean loadConfig(String fileName){
try{
FileInputStream srvConfigFile = new FileInputStream(fileName);
XMLDecoder srvConfigLoader = new XMLDecoder(srvConfigFile);
System.out.println(srvConfigFile);
settings.serverIP = (String)srvConfigLoader.readObject();
settings.classServerPort= (Integer)srvConfigLoader.readObject();
settings.registryPort = (Integer)srvConfigLoader.readObject();
settings.vlcCommand = (String)srvConfigLoader.readObject();
srvConfigLoader.close();
} catch(FileNotFoundException fnfe) {
System.out.println("Configuration not found, loading defaults...");
return false;
} catch(ClassCastException cce) {
System.out.println("Errors in Configuration, loading defaults...");
return false;
}
return true;
}
/*
* get acutal srvConfig object
*
* @return ClientConfiguration: aktuelle Konfiguration
*/
public ClientConfiguration getConfig(){
return this.settings;
}
/*
* setzen und speichern eines ClientConfiguration Files
*
* @param set
* ClientConfiguration.xml
* @return boolean: true if succesful written Configuration
*/
public boolean setConfig(ClientConfiguration set){
this.settings = set;
return this.writeConfig("ClientConfiguration.xml");
}
/*
* Sends YalpUsername and passwd to Server and returns YalpUsergroup
*
* @param username
* @param passwd
* @return AccessRights
*/
public AccessRights userVerify(String username,String passwd){
this.userName=username;
this.curPasswd = passwd;
YalpErrorHolder err = new YalpErrorHolder();
SessionHolder sess = new SessionHolder();
try{
// log on server
this.srvCon.clientLogon(this.userName,passwd,this.clientIP,sess,err);
this.session = sess.value;
this.userGroup = sess.value.me.level;
/*
} catch (RemoteException e) {
System.out.println("client.Model: Logon on Server failed 1"+ e);
e.printStackTrace();
System.out.println("client.Model: Logon on Server failed 1");
} catch (MalformedURLException e) {
System.out.println("client.Model: Logon on Server failed 2");
} catch (SQLException e) {
System.out.println("client.Model: Logon on Server failed 3");
} catch (NotBoundException e) {
System.out.println("client.Model: Logon on Server failed 4");
*/
}catch(NullPointerException e){
System.out.println("YALP Server couldn't be reached");
this.userGroup = AccessRights.NO_YALP_SERVER;
}
return this.userGroup;
}
/*
* Gets a list with all YalpUsers from the server
*
* @return ArrayList all registered YalpUsers
*/
public ArrayList getUser(){
YalpErrorHolder err = new YalpErrorHolder();
try{
UsersHolder usr = new UsersHolder();
this.srvCon.getUser(usr, err);
this.userList = new ArrayList(usr.value.length);
for(int i = 0; i < usr.value.length; i++)
this.userList.add(usr.value[i]);
}catch(Exception e){
System.out.println("Exceoption in Model userList "+ e);
}
return userList;
}
/*
* Sends User change request to server
*
* @param user
* Configuration with changes on specific YalpUser
*/
public void changeUser(YalpUser user, String passwd, Action action) {
YalpErrorHolder err = new YalpErrorHolder();
try{
this.srvCon.changeUser( user,
passwd,
action,
err );
System.out.println(err.value.descr);
}catch(Exception e){
System.out.println("Exceoption in Model changeUser "+ e);
}
}
/*
* Sends Media change request to server and refreshes Model data
*
* @param media
* to change
* @return boolean: succesful changed media
*/
public Boolean changeMedia(Media media, Action action){
YalpErrorHolder err = new YalpErrorHolder();
try{
this.srvCon.changeMedia(media, action, err);
if(err.value.code == YalpErrorCode.OK){
Media result;
for (int i=0;i: ArrayList to create Playlist from
*/
public ArrayList getToPlaylist(){
return this.toPlaylist;
}
/*
* Creates new Stream with actual playlist
*
* @return Streaminfo: about new created Stream, Client should use this,
* information to get the Information howto receive the stream
*/
public Output createOutput(){
/* t.b.d. former createStream */
streamInfo.outputAction = Action.CREATE;
Media[] a = {};
streamInfo.playlist = this.playList.toArray(a);
return this.streamInfo;
}
/*
* Sends search request to server and refreshes Model data
*
* @param request
* Search Request
* @param kind
* 1 - search in first Window; other ints: search in other window
* (admins edit view)
* @return int: number of results
*/
public int search(String request, ArrayList types, int kind){
YalpErrorHolder err = new YalpErrorHolder();
MediasHolder result = new MediasHolder();
try{
MediaType[] a = {};
if (kind == 1){
srvCon.search(request, types.toArray(a), result, err);
for(int i = 0; i < result.value.length; i++)
findMedia.add(result.value[i]);
return findMedia.size();
} else {
srvCon.search(request, types.toArray(a), result, err);
for(int i = 0; i < result.value.length; i++)
editMedia.add(result.value[i]);
return editMedia.size();
}
} catch(Exception e){
e.printStackTrace();
System.out.println("Exceoption in Model search "+ e);
return 0;
}
}
/*
* Returns the search result
*
* @param kind
* 1 - for searchMedia of mainwindow; 2 - for searchMedia of editView
* @return ArrayList: last found medias
*/
public ArrayList getMedia(int kind){
if (kind==1) return this.findMedia;
else return this.editMedia;
}
/*
* Retuns search result with given id
*
* @param id
* of the result
* @param kind
* 1 - for mainWindow, 2 for admins editView
* @return Media: searchMedia, with specified ID
*/
public Media getMediaWithId(int id,int kind){
ArrayList resultList;
if (kind==1)resultList= this.findMedia;
else resultList=this.editMedia;
for (int i=0;(i ownerList =this.userList;
for (YalpUser owner:ownerList){
if (owner.name.equals(username)){
return owner.id;
}
}
return 0;
}
/*
* Returns MediaType as string
*
* @param mediatype
* @return string
*/
public String getTypeName(MediaType type)
{
switch(type.value())
{
case MediaType._IMAGE:
return "image";
case MediaType._SOUND:
return "sound";
case MediaType._VIDEO:
return "video";
default:
return "unknown";
}
}
/*
* Returns AccessRights as string
*
* @param mediatype
* @return string
*/
public String accessRightsName(AccessRights type)
{
switch(type.value())
{
case AccessRights._USER:
return "user";
case AccessRights._ADMIN:
return "admin";
case AccessRights._DENY:
return "no login";
default:
return "unknown";
}
}
/*
* Sets class variable actualStream to given value
*
* @param aStream
* stream to srvControl via play, pause, etc
*/
public void setActualStream(Output aStream){
actualStream = aStream;
}
/*
* Starts Video Lan Player
*
* @return boolean: true if vlc can be started and a stream is actualStream
*/
private boolean startVLC(){
String vlcCmd = "/usr/bin/vlc" +
" --ignore-config --no-qt-privacy-ask --video-on-top --qt-display-mode=2";
//settings.vlcCommand
/*
switch (this.actualStream.getAccess()){
case UDP:
*/
vlcCmd += " udp://@localhost:";
/*
break;
case HTTP:
vlcCmd += "http://";
break;
default:
System.out.println(
"client.Model.startVLC: playback this type is not supported" );
}
*/
vlcCmd += "9993"; // actualStream.info.params;
System.out.println(vlcCmd);
try {
this.vlcPlayer = Runtime.getRuntime().exec(vlcCmd);
} catch (IOException e) {
System.out.println("client.Model.startVLC: starting vlcPlayer failed");
return false;
}
return true;
}
/*
* Stops Video Lan Player
*
*/
private void stopVLC(){
playback = false;
if(vlcPlayer != null)
vlcPlayer.destroy();
}
/*
* Starts playback of actual playlist
*
* @return void
*/
public boolean play(){
playback = true;
actualStream.outputAction = Action.CREATE;
actualStream.info = new AccessInfo( "bam",
"bam",
"vlc",
"params",
AccessType.STREAM );
Media[] a = new Media[playList.size()];
actualStream.playlist = playList.toArray(a);
actualStream.destIp = clientIP;
YalpErrorHolder err = new YalpErrorHolder();
OutputHolder tmp = new OutputHolder();
tmp.value = actualStream;
srvCon.control(tmp, err);
actualStream = tmp.value;
actualStream.outputAction = Action.START;
OutputHolder tmp2 = new OutputHolder(actualStream);
srvCon.control(tmp2, err);
actualStream = tmp2.value;
startVLC();
return true;
}
/*
* Adds a new Media to Playlist. Only during playback
*
* @param name
* @param path
* @return boolean: true if succesful added
*/
public boolean add2Stream(String name, String path){
YalpErrorHolder err = new YalpErrorHolder();
Media[] empty = {};
this.actualStream.playlist = empty;
Media media = new Media();
media.path = path;
media.fileName = name;
this.actualStream.playlist[this.actualStream.playlist.length] = media;
this.actualStream.outputAction = Action.CREATE;
OutputHolder tmp = new OutputHolder(this.actualStream);
this.srvCon.control(tmp, err);
this.actualStream = tmp.value;
return true;
}
/*
* Stops playback
*
* @return boolean: false - if srvConnection to streamer failed
*/
public boolean stop(){
YalpErrorHolder err = new YalpErrorHolder();
this.actualStream.outputAction = Action.STOP;
OutputHolder tmp = new OutputHolder(this.actualStream);
this.srvCon.control(tmp,err);
this.actualStream = tmp.value;
this.stopVLC();
return true;
}
/*
* jumps to next media in playlist
*
* @return boolean: false - if srvConnection to streamer failed
*/
public boolean next(){
YalpErrorHolder err = new YalpErrorHolder();
this.actualStream.outputAction = Action.FORWARD;
OutputHolder tmp = new OutputHolder(this.actualStream);
this.srvCon.control(tmp,err);
this.actualStream = tmp.value;
return true;
}
/*
* Pauses playback
*
* @return boolean: false - if srvConnection to streamer failed
*/
public boolean pause(){
YalpErrorHolder err = new YalpErrorHolder();
this.actualStream.outputAction = Action.PAUSE;
OutputHolder tmp = new OutputHolder(this.actualStream);
this.srvCon.control(tmp,err);
this.actualStream = tmp.value;
return true;
}
/*
* Causes the server to clean up and shutdown
*
*/
public void serverShutdown(){
if (this.playback)
this.stop();
this.srvCon.serverShutdown();
}
/*
* Checks if the server is still alive if not Client shutdown
*
*/
public void serverStillAlive(){
// try{
// srvCon.ping();
/* }catch (RemoteException e){
if (this.playback)
this.stopVLC();
String errorStr="Server shutdown - Client is going down too";
MessageBox messageBox = new MessageBox(
new Shell(Display.getDefault(),SWT.MIN), SWT.OK);
System.out.println(errorStr);
messageBox.setMessage(errorStr);
messageBox.open();
System.exit(0);
} */
}
/*
* Returns client IP address
*
* @return String: ipAddress
*/
public String getClientIp(){
return this.clientIP;
}
/*
* Returns username of logged in user
*
* @return String: username
*/
public String getYalpUserName(){
return this.userName;
}
/*
* Returns indication if playback is runing
*
* @return boolean: true - if is play'in
*/
public Boolean getPlayback(){
return this.playback;
}
/*
* Get Total amount of streams played
*
* @return int: number of Streams totally played
*
public int getAllStreamNum(){
try{
return this.srvCon.getStreamCounter().getAllStreams();
}catch (Exception e){
System.out.println("Exception in Model.getAllStreamNum"+e);
}
return -1;
}
*/
/*
* Gets amount of Streams actual playing
*
* @return int: number of Streams play'in at the moment
*
public int getActualStreamNum(){
try{
return this.srvCon.getStreamCounter().getActualStreams();
}catch (Exception e){
System.out.println("Exception in Model.getActualStreamNum"+e);
}
return -1;
}
*/
/*
* Sets class variable logoff to true and logs off from server
*/
public void logoff(){
YalpErrorHolder err = new YalpErrorHolder();
try{
this.logoff=true;
this.srvCon.clientLogoff(this.session, err);
}catch(Exception e) {// DEBUG
System.out.println("Model Exeptions in logoff");
e.printStackTrace();
}
}
/*
* Returns indication if client is logging of
*
* @return Boolean: true - if is logging of
*/
public Boolean getLogoff(){
return this.logoff;
}
}