Skip to content
Snippets Groups Projects
Commit 329879d0 authored by Jérémy Quentin's avatar Jérémy Quentin
Browse files

commit before merge asavard for isRecording.

parent 872b98df
No related branches found
No related tags found
No related merge requests found
......@@ -3,20 +3,36 @@
#include "callmanager_interface_p.h"
#include "callmanager_interface_singleton.h"
#include "SFLPhone.h"
#include "sflphone_const.h"
const call_state Call::stateMap [11][5] =
const call_state Call::stateActionMap [11][5] =
{
// ACCEPT REFUSE TRANSFER HOLD RECORD
/*INCOMING */ {CALL_STATE_CURRENT , CALL_STATE_OVER , CALL_STATE_OVER , CALL_STATE_HOLD , CALL_STATE_INCOMING },
/*RINGING */ {CALL_STATE_ERROR , CALL_STATE_OVER , CALL_STATE_ERROR , CALL_STATE_ERROR , CALL_STATE_RINGING },
/*CURRENT */ {CALL_STATE_ERROR , CALL_STATE_OVER , CALL_STATE_TRANSFER , CALL_STATE_HOLD , CALL_STATE_CURRENT },
/*DIALING */ {CALL_STATE_RINGING , CALL_STATE_OVER , CALL_STATE_ERROR , CALL_STATE_ERROR , CALL_STATE_DIALING },
/*HOLD */ {CALL_STATE_ERROR , CALL_STATE_OVER , CALL_STATE_TRANSFER_HOLD , CALL_STATE_CURRENT , CALL_STATE_HOLD },
/*HOLD */ {CALL_STATE_ERROR , CALL_STATE_OVER , CALL_STATE_TRANSF_HOLD , CALL_STATE_CURRENT , CALL_STATE_HOLD },
/*FAILURE */ {CALL_STATE_ERROR , CALL_STATE_OVER , CALL_STATE_ERROR , CALL_STATE_ERROR , CALL_STATE_ERROR },
/*BUSY */ {CALL_STATE_ERROR , CALL_STATE_OVER , CALL_STATE_ERROR , CALL_STATE_ERROR , CALL_STATE_ERROR },
/*TRANSFER */ {CALL_STATE_OVER , CALL_STATE_OVER , CALL_STATE_CURRENT , CALL_STATE_TRANSF_HOLD , CALL_STATE_TRANSFER },
/*TRANSF_HOLD */ {CALL_STATE_OVER , CALL_STATE_OVER , CALL_STATE_HOLD , CALL_STATE_TRANSFER , CALL_STATE_TRANSF_HOLD },
/*OVER */ {CALL_STATE_ERROR , CALL_STATE_ERROR , CALL_STATE_ERROR , CALL_STATE_ERROR , CALL_STATE_ERROR },
/*ERROR */ {CALL_STATE_ERROR , CALL_STATE_ERROR , CALL_STATE_ERROR , CALL_STATE_ERROR , CALL_STATE_ERROR }
};
const call_state Call::stateChangedMap [11][6] =
{
// RINGING CURRENT BUSY HOLD HUNGUP FAILURE
/*INCOMING */ {CALL_STATE_CURRENT , CALL_STATE_OVER , CALL_STATE_OVER , CALL_STATE_HOLD , CALL_STATE_INCOMING },
/*RINGING */ {CALL_STATE_ERROR , CALL_STATE_OVER , CALL_STATE_ERROR , CALL_STATE_ERROR , CALL_STATE_RINGING },
/*CURRENT */ {CALL_STATE_ERROR , CALL_STATE_OVER , CALL_STATE_TRANSFER , CALL_STATE_HOLD , CALL_STATE_CURRENT },
/*DIALING */ {CALL_STATE_RINGING , CALL_STATE_OVER , CALL_STATE_ERROR , CALL_STATE_ERROR , CALL_STATE_DIALING },
/*HOLD */ {CALL_STATE_ERROR , CALL_STATE_OVER , CALL_STATE_TRANSF_HOLD , CALL_STATE_CURRENT , CALL_STATE_HOLD },
/*FAILURE */ {CALL_STATE_ERROR , CALL_STATE_OVER , CALL_STATE_ERROR , CALL_STATE_ERROR , CALL_STATE_ERROR },
/*BUSY */ {CALL_STATE_ERROR , CALL_STATE_OVER , CALL_STATE_ERROR , CALL_STATE_ERROR , CALL_STATE_ERROR },
/*TRANSFER */ {CALL_STATE_OVER , CALL_STATE_OVER , CALL_STATE_CURRENT , CALL_STATE_TRANSFER_HOLD , CALL_STATE_TRANSFER },
/*TRANSFER_HOLD */ {CALL_STATE_OVER , CALL_STATE_OVER , CALL_STATE_HOLD , CALL_STATE_TRANSFER , CALL_STATE_TRANSFER_HOLD },
/*TRANSFER */ {CALL_STATE_OVER , CALL_STATE_OVER , CALL_STATE_CURRENT , CALL_STATE_TRANSF_HOLD , CALL_STATE_TRANSFER },
/*TRANSF_HOLD */ {CALL_STATE_OVER , CALL_STATE_OVER , CALL_STATE_HOLD , CALL_STATE_TRANSFER , CALL_STATE_TRANSF_HOLD },
/*OVER */ {CALL_STATE_ERROR , CALL_STATE_ERROR , CALL_STATE_ERROR , CALL_STATE_ERROR , CALL_STATE_ERROR },
/*ERROR */ {CALL_STATE_ERROR , CALL_STATE_ERROR , CALL_STATE_ERROR , CALL_STATE_ERROR , CALL_STATE_ERROR }
};
......@@ -46,11 +62,11 @@ Call::Call(call_state startState, QString callId)
this->currentState = startState;
}
Call::Call(call_state startState, QString callId, QString from, Account & account)
Call::Call(call_state startState, QString callId, QString from, QString account)
{
this->callId = callId;
this->item = new QListWidgetItem(from);
this->account = & account;
this->account = account;
this->recording = false;
this->currentState = startState;
}
......@@ -66,7 +82,7 @@ Call * Call::buildDialingCall(QString callId)
return call;
}
Call * Call::buildIncomingCall(QString callId, QString from, Account & account)
Call * Call::buildIncomingCall(const QString & callId, const QString & from, const QString & account)
{
Call * call = new Call(CALL_STATE_INCOMING, callId, from, account);
return call;
......@@ -82,8 +98,42 @@ call_state Call::getState() const
return currentState;
}
call_state Call::stateChanged(const QString & newState)
{
if(newState == QString(CALL_STATE_CHANGE_HUNG_UP))
{
this->currentState = CALL_STATE_OVER;
}
else if(newState == QString(CALL_STATE_CHANGE_HOLD))
{
this->currentState = CALL_STATE_HOLD;
}
else if(newState == QString(CALL_STATE_CHANGE_UNHOLD_CURRENT))
{
this->currentState = CALL_STATE_CURRENT;
}
else if(newState == QString(CALL_STATE_CHANGE_CURRENT))
{
this->currentState = CALL_STATE_CURRENT;
}
else if(newState == QString(CALL_STATE_CHANGE_RINGING))
{
this->currentState = CALL_STATE_RINGING;
}
else if(newState == QString(CALL_STATE_CHANGE_UNHOLD_RECORD))
{
this->currentState = CALL_STATE_CURRENT;
this->recording = true;
}
return this->currentState;
}
call_state Call::action(call_action action, QString number)
{
if(action == CALL_ACTION_STATE_CHANGED)
{
return stateChanged(number);
}
call_state previousState = currentState;
//execute the action associated with this transition
(this->*(functionMap[currentState][action]))(number);
......@@ -125,6 +175,8 @@ void Call::accept(QString number)
CallManagerInterface & callManager = CallManagerInterfaceSingleton::getInstance();
qDebug() << "Accepting call. callId : " << callId;
callManager.accept(callId);
this->startTime = & QDateTime::currentDateTime();
this->historyState = INCOMING;
}
void Call::refuse(QString number)
......@@ -132,6 +184,8 @@ void Call::refuse(QString number)
CallManagerInterface & callManager = CallManagerInterfaceSingleton::getInstance();
qDebug() << "Refusing call. callId : " << callId;
callManager.refuse(callId);
this->startTime = & QDateTime::currentDateTime();
this->historyState = MISSED;
}
void Call::acceptTransf(QString number)
......@@ -140,6 +194,7 @@ void Call::acceptTransf(QString number)
qDebug() << "Accepting call and transfering it to number : " << number << ". callId : " << callId;
callManager.accept(callId);
callManager.transfert(callId, number);
//this->historyState = TRANSFERED;
}
void Call::acceptHold(QString number)
......@@ -148,6 +203,7 @@ void Call::acceptHold(QString number)
qDebug() << "Accepting call and holding it. callId : " << callId;
callManager.accept(callId);
callManager.hold(callId);
this->historyState = INCOMING;
}
void Call::hangUp(QString number)
......@@ -167,9 +223,10 @@ void Call::hold(QString number)
void Call::call(QString number)
{
CallManagerInterface & callManager = CallManagerInterfaceSingleton::getInstance();
QString account = SFLPhone::firstAccount();
qDebug() << "Calling " << number << " with account " << account << ". callId : " << callId;
this->account = SFLPhone::firstAccount();
qDebug() << "Calling " << number << " with account " << this->account << ". callId : " << callId;
callManager.placeCall(account, callId, number);
this->historyState = OUTGOING;
}
void Call::transfer(QString number)
......@@ -178,6 +235,7 @@ void Call::transfer(QString number)
QString account = SFLPhone::firstAccount();
qDebug() << "Transfering call to number : " << number << ". callId : " << callId;
callManager.transfert(callId, number);
this->stopTime = & QDateTime::currentDateTime();
}
void Call::unhold(QString number)
......@@ -197,6 +255,7 @@ void Call::setRecord(QString number)
{
CallManagerInterface & callManager = CallManagerInterfaceSingleton::getInstance();
qDebug() << "Setting record for call. callId : " << callId;
callManager.unhold(callId);
callManager.setRecording(callId);
recording = !recording;
}
......@@ -25,7 +25,7 @@ typedef enum
/** Call is being transfered. During this state, the user can enter the new number. */
CALL_STATE_TRANSFER,
/** Call is on hold for transfer */
CALL_STATE_TRANSFER_HOLD,
CALL_STATE_TRANSF_HOLD,
/** Call is over and should not be used */
CALL_STATE_OVER,
/** This state should never be reached */
......@@ -46,9 +46,23 @@ typedef enum
/** Blue-green button, hold or unhold the call */
CALL_ACTION_HOLD,
/** Record button, enable or disable recording */
CALL_ACTION_RECORD
CALL_ACTION_RECORD,
/** Other user state changes */
CALL_ACTION_STATE_CHANGED
} call_action;
/**
* @enum history_state
* This enum have all the state a call can take in the history
*/
typedef enum
{
NONE,
INCOMING,
OUTGOING,
MISSED
} history_state;
class Call;
......@@ -59,15 +73,14 @@ class Call
private:
//Call attributes
Account * account;
QString account;
QString callId;
QString from;
QString to;
// HistoryState * historyState;
QTime start;
QTime stop;
history_state historyState;
QDateTime * startTime;
QDateTime * stopTime;
QListWidgetItem * item;
//Automate * automate;
//Automate attributes
static const call_state stateMap [11][5];
......@@ -76,7 +89,7 @@ private:
bool recording;
Call(call_state startState, QString callId);
Call(call_state startState, QString callId, QString from, Account & account);
Call(call_state startState, QString callId, QString from, QString account);
//Automate functions
void nothing(QString number);
......@@ -96,10 +109,11 @@ public:
~Call();
static Call * buildDialingCall(QString callId);
static Call * buildIncomingCall(QString callId, QString from, Account & account);
static Call * buildIncomingCall(const QString & callId, const QString & from, const QString & account);
QListWidgetItem * getItem();
call_state getState() const;
QString getCallId();
call_state stateChanged(const QString & newState);
call_state action(call_action action, QString number = NULL);
call_state getCurrentState() const;
......
......@@ -7,7 +7,7 @@ CallList::CallList()
}
Call * CallList::operator[](QListWidgetItem * item)
Call * CallList::operator[](const QListWidgetItem * item)
{
for(int i = 0 ; i < size() ; i++)
{
......@@ -19,9 +19,21 @@ Call * CallList::operator[](QListWidgetItem * item)
return NULL;
}
Call * CallList::operator[](const QString & callId)
{
for(int i = 0 ; i < size() ; i++)
{
if ((*calls)[i]->getCallId() == callId)
{
return (*calls)[i];
}
}
return NULL;
}
QString CallList::getAndIncCallId()
{
QString res = QString::number(callIdCpt);
QString res = QString::number(callIdCpt++);
return res;
}
......@@ -38,7 +50,7 @@ QListWidgetItem * CallList::addDialingCall()
return call->getItem();
}
QListWidgetItem * CallList::addIncomingCall(QString callId, QString from, Account & account)
QListWidgetItem * CallList::addIncomingCall(const QString & callId, const QString & from, const QString & account)
{
Call * call = Call::buildIncomingCall(callId, from, account);
calls->append(call);
......
......@@ -14,10 +14,12 @@ public:
CallList();
~CallList();
Call * operator[](QListWidgetItem * item);
Call * operator[](const QListWidgetItem * item);
Call * operator[](const QString & callId);
void remove(Call * call);
QListWidgetItem * addDialingCall();
QListWidgetItem * addIncomingCall(QString callId, QString from, Account & account);
QListWidgetItem * addIncomingCall(const QString & callId, const QString & from, const QString & account);
QString getAndIncCallId();
int size();
......
......@@ -124,37 +124,21 @@
<property name="text" >
<string>Général</string>
</property>
<property name="icon" >
<iconset>
<normaloff>:/Images/sflphone.png</normaloff>:/Images/sflphone.png</iconset>
</property>
</item>
<item>
<property name="text" >
<string>Affichage</string>
</property>
<property name="icon" >
<iconset>
<normaloff>:/Images/sflphone.png</normaloff>:/Images/sflphone.png</iconset>
</property>
</item>
<item>
<property name="text" >
<string>Comptes</string>
</property>
<property name="icon" >
<iconset>
<normaloff>:/Images/stock_person.svg</normaloff>:/Images/stock_person.svg</iconset>
</property>
</item>
<item>
<property name="text" >
<string>Audio</string>
</property>
<property name="icon" >
<iconset>
<normaloff>:/Images/icon_volume_off.svg</normaloff>:/Images/icon_volume_off.svg</iconset>
</property>
</item>
</widget>
</item>
......
......@@ -87,6 +87,7 @@ void SFLPhone::action(QListWidgetItem * item, call_action action)
updateWindowCallState();
}
/*******************************************
******** Update Display Functions **********
*******************************************/
......@@ -100,6 +101,7 @@ void SFLPhone::updateWindowCallState()
char * iconFile;
char * buttonIconFiles[3] = {ICON_CALL, ICON_HANGUP, ICON_HOLD};
bool transfer = false;
bool record = false;
if (!item)
{
......@@ -173,7 +175,8 @@ void SFLPhone::updateWindowCallState()
break;
case CALL_STATE_OVER:
qDebug() << "Reached CALL_STATE_OVER. Deleting call " << (*callList)[item]->getCallId();
delete (*callList)[item];
//delete (*callList)[item];
callList->remove((*callList)[item]);
return;
break;
case CALL_STATE_ERROR:
......@@ -500,17 +503,22 @@ void SFLPhone::on_actionBoite_vocale_triggered()
void SFLPhone::on_callStateChanged(const QString &callID, const QString &state)
{
qDebug() << "on_callStateChanged !";
qDebug() << "on_callStateChanged " << callID << " . New state : " << state;
(*callList)[callID]->action(CALL_ACTION_STATE_CHANGED, state);
updateWindowCallState();
}
void SFLPhone::on_error(MapStringString details)
{
qDebug() << "on_error !";
qDebug() << "Daemon error : " << details;
}
void SFLPhone::on_incomingCall(const QString &accountID, const QString & callID, const QString &from)
{
qDebug() << "Incoming Call !";
QListWidgetItem * item = callList->addIncomingCall(callID, from, accountID);
listWidget_callList->addItem(item);
listWidget_callList->setCurrentRow(listWidget_callList->count() - 1);
}
void SFLPhone::on_incomingMessage(const QString &accountID, const QString &message)
......
......@@ -49,8 +49,6 @@ private slots:
void on_actionBoite_vocale_triggered();
//void on_actionAbout();
void on_pushButton_1_clicked();
void on_pushButton_2_clicked();
void on_pushButton_3_clicked();
......
......@@ -56,6 +56,10 @@
<arg type="d" name="value" direction="out"/>
</method>
<method name="setRecording">
<arg type="s" name="callID" direction="in"/>
</method>
<method name="getCallDetails">
<arg type="s" name="callID" direction="in"/>
<annotation name="com.trolltech.QtDBus.QtTypeName.Out0" value="MapStringString"/>
......
/*
* This file was generated by dbusxml2cpp version 0.6
* Command line was: dbusxml2cpp -c CallManagerInterface -p call_manager_interface_p.h:call_manager_interface.cpp -i metatypes.h callmanager-introspec.xml
* Command line was: dbusxml2cpp -c CallManagerInterface -p callmanager_interface_p.h:callmanager_interface.cpp -i metatypes.h callmanager-introspec.xml
*
* dbusxml2cpp is Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies).
*
......
/*
* This file was generated by dbusxml2cpp version 0.6
* Command line was: dbusxml2cpp -c CallManagerInterface -p call_manager_interface_p.h:call_manager_interface.cpp -i metatypes.h callmanager-introspec.xml
* Command line was: dbusxml2cpp -c CallManagerInterface -p callmanager_interface_p.h:callmanager_interface.cpp -i metatypes.h callmanager-introspec.xml
*
* dbusxml2cpp is Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies).
*
......@@ -8,8 +8,8 @@
* Do not edit! All changes made to it will be lost.
*/
#ifndef CALL_MANAGER_INTERFACE_P_H_1236370787
#define CALL_MANAGER_INTERFACE_P_H_1236370787
#ifndef CALLMANAGER_INTERFACE_P_H_1237229754
#define CALLMANAGER_INTERFACE_P_H_1237229754
#include <QtCore/QObject>
#include <QtCore/QByteArray>
......@@ -99,6 +99,13 @@ public Q_SLOTS: // METHODS
return callWithArgumentList(QDBus::Block, QLatin1String("refuse"), argumentList);
}
inline QDBusReply<void> setRecording(const QString &callID)
{
QList<QVariant> argumentList;
argumentList << qVariantFromValue(callID);
return callWithArgumentList(QDBus::Block, QLatin1String("setRecording"), argumentList);
}
inline QDBusReply<void> setVolume(const QString &device, double value)
{
QList<QVariant> argumentList;
......
......@@ -48,7 +48,7 @@
#define ICON_FAILURE ":/images/icons/fail.svg"
#define ICON_BUSY ":/images/icons/busy.svg"
#define ICON_TRANSFER ":/images/icons/transfert.svg"
#define ICON_TRANSFER_HOLD ":/images/icons/transfert.svg"
#define ICON_TRANSF_HOLD ":/images/icons/transfert.svg"
#define ICON_CALL ":/images/icons/call.svg"
#define ICON_HANGUP ":/images/icons/hang_up.svg"
......@@ -94,6 +94,13 @@
#define ACCOUNT_STATE_ERROR_CONF_STUN "ERROR_CONF_STUN"
#define ACCOUNT_STATE_ERROR_EXIST_STUN "ERROR_EXIST_STUN"
#define CALL_STATE_CHANGE_HUNG_UP "HUNGUP"
#define CALL_STATE_CHANGE_RINGING "RINGING"
#define CALL_STATE_CHANGE_CURRENT "CURRENT"
#define CALL_STATE_CHANGE_HOLD "HOLD"
#define CALL_STATE_CHANGE_BUSY "BUSY"
#define CALL_STATE_CHANGE_FAILURE "FAILURE"
#define MAX_HISTORY_CAPACITY 60
#define CODEC_NAME 0
......
No preview for this file type
<?xml version = '1.0' encoding = 'UTF-8'?>
<!DOCTYPE KDevPrjSession>
<KDevPrjSession>
<DocsAndViews NumberOfDocuments="8" >
<Doc0 NumberOfViews="1" URL="file:///home/jquentin/sflphone/sflphone_kde/SFLPhone.cpp" >
<View0 Encoding="" line="526" Type="Source" />
</Doc0>
<Doc1 NumberOfViews="1" URL="file:///home/jquentin/sflphone/sflphone_kde/callmanager_interface_singleton.cpp" >
<DocsAndViews NumberOfDocuments="14" >
<Doc0 NumberOfViews="1" URL="file:///home/jquentin/sflphone/sflphone_kde/callmanager_interface_singleton.cpp" >
<View0 Encoding="" line="0" Type="Source" />
</Doc0>
<Doc1 NumberOfViews="1" URL="file:///home/jquentin/sflphone/sflphone_kde/callmanager_interface_p.h" >
<View0 Encoding="" line="140" Type="Source" />
</Doc1>
<Doc2 NumberOfViews="1" URL="file:///home/jquentin/sflphone/sflphone_kde/callmanager_interface_p.h" >
<View0 Encoding="" line="135" Type="Source" />
<Doc2 NumberOfViews="1" URL="file:///home/jquentin/sflphone/sflphone_kde/Call.h" >
<View0 Encoding="" line="27" Type="Source" />
</Doc2>
<Doc3 NumberOfViews="1" URL="file:///home/jquentin/sflphone/sflphone_kde/callmanager_interface.cpp" >
<View0 Encoding="" line="17" Type="Source" />
<Doc3 NumberOfViews="1" URL="file:///home/jquentin/sflphone/sflphone_kde/SFLPhone.cpp" >
<View0 Encoding="" line="503" Type="Source" />
</Doc3>
<Doc4 NumberOfViews="1" URL="file:///home/jquentin/sflphone/sflphone_kde/main.cpp" >
<View0 Encoding="" line="19" Type="Source" />
<Doc4 NumberOfViews="1" URL="file:///home/jquentin/sflphone/sflphone_kde/sflphone_const.h" >
<View0 Encoding="" line="50" Type="Source" />
</Doc4>
<Doc5 NumberOfViews="1" URL="file:///home/jquentin/sflphone/sflphone_kde/SFLPhone.h" >
<View0 Encoding="" line="74" Type="Source" />
<Doc5 NumberOfViews="1" URL="file:///home/jquentin/sflphone/sflphone_kde/callmanager-introspec.xml" >
<View0 Encoding="" line="80" Type="Source" />
</Doc5>
<Doc6 NumberOfViews="1" URL="file:///home/jquentin/sflphone/sflphone_kde/callmanager-introspec.xml" >
<View0 Encoding="" line="78" Type="Source" />
<Doc6 NumberOfViews="1" URL="file:///home/jquentin/sflphone/sflphone_kde/SFLPhone.h" >
<View0 Encoding="" line="23" Type="Source" />
</Doc6>
<Doc7 NumberOfViews="1" URL="file:///home/jquentin/sflphone/sflphone_kde/build/moc_SFLPhone.cpp" >
<View0 Encoding="" line="191" Type="Source" />
<Doc7 NumberOfViews="1" URL="file:///home/jquentin/sflphone/sflphone_kde/CallList.h" >
<View0 Encoding="" line="18" Type="Source" />
</Doc7>
<Doc8 NumberOfViews="1" URL="file:///home/jquentin/sflphone/sflphone_kde/CallList.cpp" >
<View0 Encoding="" line="42" Type="Source" />
</Doc8>
<Doc9 NumberOfViews="1" URL="file:///home/jquentin/sflphone/sflphone_kde/Call.cpp" >
<View0 Encoding="" line="26" Type="Source" />
</Doc9>
<Doc10 NumberOfViews="1" URL="file:///home/jquentin/sflphone/sflphone_kde/Automate.h" >
<View0 Encoding="" line="0" Type="Source" />
</Doc10>
<Doc11 NumberOfViews="1" URL="file:///home/jquentin/sflphone/sflphone_kde/Automate.cpp" >
<View0 Encoding="" line="0" Type="Source" />
</Doc11>
<Doc12 NumberOfViews="1" URL="file:///home/jquentin/sflphone/sflphone_kde/templates/cpp" >
<View0 Encoding="" line="17" Type="Source" />
</Doc12>
<Doc13 NumberOfViews="1" URL="file:///home/jquentin/sflphone/sflphone_kde/templates/h" >
<View0 Encoding="" line="7" Type="Source" />
</Doc13>
</DocsAndViews>
<pluginList>
<kdevdebugger>
......
/***************************************************************************
* Copyright (C) 2009 by Jérémy Quentin *
* jeremy.quentin@gmail.com *
* Copyright (C) 2009 by Savoir-Faire Linux *
* Author : Jérémy Quentin *
* jeremy.quentin@savoirfairelinux.com *
* *
* This program 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 2 of the License, or *
* the Free Software Foundation; either version 3 of the License, or *
* (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
......
/***************************************************************************
* Copyright (C) 2009 by Jérémy Quentin *
* jeremy.quentin@gmail.com *
* Copyright (C) 2009 by Savoir-Faire Linux *
* Author : Jérémy Quentin *
* jeremy.quentin@savoirfairelinux.com *
* *
* This program 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 2 of the License, or *
* the Free Software Foundation; either version 3 of the License, or *
* (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment