Home
Java_RMI
Contents
1. N Le serveur de m thodes un client java_rmi Exemple Interface commune aux clients et au serveur import java rmi Remote import java rmi RemoteException public interface AffichageLointain extends Remote public void methodeLointaine throws RemoteException public static final String nomDuService leServeurDeMethodes L interface commune doit h riter de l interface java rmi Remote pour chaque m thode ajouter la clause throws java rmi RemoteException tre publique java_rmi Exemple Le serveur machine Imi93 import java rmi import java rmi server UnicastRemoteObject public class ServeurDeMethodes extends UnicastRemoteOb ject implements AffichageLointain public void methodeLointaine throws RemoteException System out printin shalom public ServeurDeMethodes throws RemoteException public static void main String args throws Exception try AffichageLointain serveur new ServeurDeMethodes Naming rebind AffichageLointain nomDuService serveur System out println Le serveur lointain est pret catch Exception e throw e F java_rmi Exemple Le client machine Imi27 import java rmi public class Client public static void main String args throws Exception System setSecurityManager new RMISecurityManager AffichageLointain serveur null String nomComplet nomComplet rmi 1mi86 AffichageLoi
2. Entr es sorties Machine A Le client Imi27 MVJ R seau e Applications existantes d velopp es en C C assembleur e Acc s entr es sorties distantes java_rmi Le GestionnaireDeTaches en natif En exemple le gestionnaire de taches est partiellement crit en code natif pattern Adapter adaptateur reste le m me seul l adapt change import java util Vector public class GestionnaireNatifDeTaches implements Gestionnaire private ThreadGroup table private Vector liste public GestionnaireNatifDeTaches String nom table new ThreadGroup nom liste new Vector public native void executer Runnable r throws Exception public native Vector liste throws Exception static System loadLibrary GestionnaireNatifDeTaches java_rmi java_rmi GestionnaireNatifDeTaches h Commande gt javac GestionnaireNatifDeTaches java Commande gt javah jni GestionnaireNatifDeTaches DO NOT EDIT THIS FILE it is machine generated include lt jni h gt Header for class GestionnaireNatifDeTaches ifndef _Included_GestionnaireNatifDeTaches define _Included GestionnaireNatifDeTaches Class GestionnaireNatifDeTaches Method executer Signature Ljava lang Runnable V xy JNIEXPORT void JNICALL Java_GestionnaireNatifDeTaches_executer JNIEnv jobject jobject Class GestionnaireNatif Method liste Signature Ljava util Vector a JNIEX
3. elle est commune au serveur et aux clients et h rite au sens Java entre interfaces de java rmi Remote un marqueur public interface Remote e Le serveur h rite d une classe pr d finie du package java rmi server et s inscrit aupres d un gestionnaire de services e Les clients recherchent le service propose obtiennent une r f rence de l objet distant et effectuent les appels de m thodes habituels ces m thodes tant d clar es dans l interface commune java_rmi 4 java_rmi D veloppement en Java mode d emploi L interface est commune aux clients et au serveur et recense les m thodes distantes elle h rite de java rmi Remote et chaque m thode poss de la clause throws java rmi RemoteException La classe Serveur h rite de java rmi server UnicastRemoteObject et implemente les m thodes de interface commune sans oublier le constructeur qui poss de galement la clause throws Le serveur propose ses services aide de la m thode java rmi Naming rebind Les classes Clientes utilisent une instance de la classe Serveur obtenue par appel de java rmi Naming lookup Et c est tout enfin presque L pisode 1 2 et le package java rmi activation proposeront quelques modifications a ce mode d emploi 4 Exemple un serveur de m thodes interface Remote extends interface lt Client AffichageLointain UnicastRemoteObject extends implements ServeurDeMethodes
4. Exemple Un client et un serveur de t ches Episode 3 UNI RMI entr es sorties distantes JDBC RMI acc s une base de donn es e Episode 1 2 N JDK1 2 rmid et la classe java rmi activation Activatable java_rmi Episode 1 Objectifs Machine A Le client MVJ R seau public class Client ServeurDeMethodes s RMI s methodeLointaine O java_rmi p Machine B Le serveur MVJ public class ServeurDeMethodes void methodeLointaine System out printi1n shalom 4 gt lt Quoi e Ou se trouve le serveur e Comment d clenche t on void methodeLointaine e Les acc s sont ils s curis s e Et les param tres les r sultats gt Episode2 java_rmi Comment gt e La machine Serveur est identifi e par une adresse IP ou un nom octroy par l administrateur du DNS e La classe Serveur est associ e a un nom r pertori utilitaire jdk rmiregistry e La communication est prise en charge par une procuration fournie par le serveur au client et une interface sur le serveur utilitaire jdk rmic e La classe java rmi RMISecurityManager autorise les acc s distants et pr cise les contraintes d acc s aux fichiers en g n ral un fichier policy s Import Java EME fu em standard import Java UM wae Lac LOren java_rmi 4 D veloppement en Java principes e Une interface pr cise les m thodes distantes
5. 0 SeC ri if sec 59 mn sec 0 if mn 59 h mn 0 if h 24 h 0 System out println h mn sec catch Exception e Mais cette classe est inconnue du serveur Alors java_rmi 4 Le serveur demande Horloge class Machine Le client Machine B Le serveur MVJ MVJ public class ServeurDeTaches Horloge class gt java_rmi void executer Runnable r new Thread r start 4 Comment est il satisfait e Imi27 d rmi ServeurDeMethodes Client gt java Djava rmi server codebase file D rmi ServeurDeMethodes Client Djava security policy java policy Client ou avec l aide d un serveur http gt Start java SimpleHttpd 8088 gt java Djava rmi server codebase http Imi27 8088 D rmi ServeurDeMethodes Client Djava security policy java policy Client java_rmi 4 D veloppement une ligne de conduite Peut on effectuer un d veloppement en local et mettre en uvre simplement le m canisme RMI e Comment assurer un faible couplage des classes assurant le RMI et les autres classes e Peut on oublier RMI Une solution usage du Pattern Adapter http www transvirtual com users peter patterns overview html http www eli sdsu edu courses spring98 cs635 notes index html java_rmi 4 Exemple Le serveur de t ches UnicastRemoteObject Adaptateur Adapt Adaptateur RMI Les classes en
6. PORT jobject JNICALL Java_GestionnaireNatifDeTaches_liste JNIEnv jobject endif Java assez Application en C lt gt Application en C java_rmi JDBC RMI import java sql public class GestionnaireDeTachesAvecDB implements Gestionnairef private static Connection dbConn public void executer Runnable r throws Exception tid Statement s dbConn createStatement int r s executeUpdate INSERT INTO gestionnaireDB tid uw a a public Vector liste throws Exception Statement s dbConn createStatement ResultSet r s executeQuery SELECT tid FROM gestionnaireDB affectation du vecteur par le parcours de r Static Class forName jdbc hsqldb JdbcDriver dbConn DiverManager getConnection jdbc hsqldb db1 sa java_rmi 4 Episode 1 2 Activatable Objectifs e Activation des objets distants la demande des clients sur le serveur e L utilitaire dk rmid engendre des instances la demande e en cons quence la classe ServeurDeTaches n est plus r sidente java rmi Activatable e import java rmi activation Activatable e I faut entre autres installer rmid sur le serveur par d faut le port 1098 gt start rmid en Java indiquer le r pertoire dans lequel se trouve les classes du serveur soit file d jfd rmi ServeurDeTaches_Activatable Serveur identifier le nom de la classe qui est charg e dynamiquement soi
7. Remote Method Invocation 1999 Cnam Paris jean michel Douin douin cnam fr Notes de cours consacr es a RMI Version du 18 Mars 2002 http 1mi92 cnam fr 8080 tp_cdi douin Java_RMI pdf http 1mi92 cnam fr 8080 tp_cdi TpRmi TpRmi html java_rmi Principale bibliographie Java Distributed Computing Jim Farley The Java series O Reilly 1998 http www eli sdsu edu courses spring99 cs696 notes index html e RMI http java http java http java http java http java e JNI sun sun sun sun sun com products jdk 1 2 docs guide rmi index html com j2se 1 3 docs guide rmi index html com products jdk 1 2 docs guide security PolicyFiles html com products jdk 1 2 docs guide security permissions html com docs books tutorial rmi index html http java sun com docs books tutorial nativel 1 index html http 1mi92 cnam fr 8080 tp_cdi douin java_JNI pdf e JDBC tutorial http java sun com docs books tutorial jdbc index html e Pattern Proxy Adapter http www transvirtual com users peter patterns overview html http www eli sdsu edu courses spring98 cs635 notes index html java_rmi 4 Sommaire Episode 1 Exemple Un client et un serveur de m thodes t l chargement rmiregistry Le serveur et rmic le Pattern Proxy Episode 2 Persistance Passage de param tres et retour de fonctions Un serveur http t l chargement de classes M thode Usage du Pattern Adapter
8. Serveur java Djava rmi server codebase file d jfd rmi ServeurDeTaches_Activatable Serveur Djava security policy java policy ServeurDeTaches e Ex cution du client start Java SimpleHttpd 8088 java Djava rmi server codebase 1mi27 8088 d jfd rmi ServeurDeTaches_ Activatable Client Djava security policy java policy TacheCliente java_rmi Activatable et plus e La classe peut ne pas h riter de Activatable Activatable exportObject this id 0 sera pr sente dans le corps du constructeur d arit 2 de la classe distante public ClasseDistante ActivationID id MarshalledObject data e On peut se servir de instance de MarshalledObject afin de rendre certaines donn es du serveur persistantes aupres de rmid m new MarshalledObject new File d rmi persistent ser et au Sein du constructeur f File m get voir http java sun com products jdk 1 2 docs guide rmi activation html java_rmi 4 Conclusion RMI Remote Method Innovation passage de parametres transmission de code RMI 1 2 Activatable JINI Plug and play A suivre a compl ter Synchronisation entre plusieurs clients synchronized Passage de messages RemoteEventObject MulticastRemoteObject N JNDI JRMS java_rmi
9. ct m throws RemoteException Java io IOException ClassNotFoundException super id 0 this gestionnaire GestionnaireDeTaches m get public void executer Runnable r throws RemoteException Exception gestionnaire executer r public java util Vector liste throws RemoteException Exception return gestionnaire liste 8 La classe GestionnaireDeTaches e L adapte s est adapt e this gestionnaire GestionnaireDeTaches m get import java io Serializable public class GestionnaireDeTaches implements Gestionnaire Serializable private transient ThreadGroup table private Vector liste java_rmi ServeurDeTaches import Java rmi import java rmi activation import java util Properties public class ServeurDeTaches public static void main String args throws Exception System setSecurityManager new RMISecurityManager r f rence sur java policy les contraintes de s curit doivent doit tre fournies 1 ActivationGroup ici par 1 interm diaire d une instance de Properties qui h rite de HashTable Properties props new Properties props put Java security policy de id rmi java policy ActivationGroupDesc CommandEnvironment ace null ActivationGroupDesc exampleGroup newActivationGroupDesc props ace java_rmi ServeurDeTaches Obtention de son ID port ActivationGroupID agi agi Act
10. ent 2 Les traces sur la console du serveur Web EMI93 127 0 0 1 Request GET ServeurDeMethodes_Stub class HTTP 1 1 java_rmi 4 rmic _skel class stub class Machine A Le client Imi27 Machine B Le serveur Imi86 gt rmiregistry Communication et transmission des parametres sur le r seau totalement transparents _Stub interface r seau fournie au client N _skel mis en forme des param tres et r sultats inutile en 1 2 java_rmi Le pattern Proxy AffichageLointain void methodeLointaine GestionnaireDistant GestionnaireDistantDeMethodes DeMethodes_ stub N void methodeLointaine void methodeLointaine gt Acc s distant java_rmi 4 rmic keep e rmic keep ServeurDeMethodes ServeurDeMethodes_stub java et ServeurDeMethodes_skel java e rmic keep v1 2 ServeurDeMethodes ServeurDeMethodes_stub java java_rmi 4 rmiregistry port 1099 par d faut gt Start rmiregistry 1999 alors nomComplet rmi 1mi86 1999 transfert du fichier stub aux clients e Naming rebind pour le serveur e Naming lookup pour les clients Note Si cet utilitaire en fonction de la variable CLASSPATH a acc s aux fichiers _stub la commande Djava rmi server codebase xxxxx est ignor e N Voir java rmi registry LocateRegistry java_rmi java_rmi java security policy java policy le fichier java policy en exemples grant permiss
11. intln le serveur GestionnaireDistant nomDuService a demarre catch Exception e throw e java_rmi Le Client TacheCliente java import java rmi public class TacheCliente public static void main String args throws Exception String machine lmi27 if args length 1 machine args 0 System setSecurityManager new RMISecurityManager GestionnaireDistant monl null String nom rmi machine GestionnaireDistant nomDuService try monl GestionnaireDistant Naming lookup nom catch Exception e throw e LEYA monl executer new Horloge monl executer new Horloge System out printin monl liste monl executer new Horloge System out printiln monl liste catch Exception e throw e java_rmi 4 Comment les commandes le serveur e Imi86 d rmi ServeurDeTaches Serveur gt set CLASSPATH le fichier _stub doit tre inaccessible par rmiregsitry gt start rmiregistry gt java Djava rmi server codebase file D rmi ServeurDeT aches Serveur Djava security policy java policy ServeurDeT aches java_rmi 4 Comment les commandes le client e Imi27 d rmi ServeurDeTaches Client gt java Djava rmi server codebase file D rmi ServeurDeTaches Client Djava security policy java policy TacheCliente OU a l aide d un serveur http e Imi27 d rmi ServeurDeTaches Client gt start java SimpleHttpd 8088 g
12. ion java security AllPermission ou bien mieux grant permission java net SocketPermission localhost connect accept listen permission java net SocketPermission lmi86 cnam fr 8080 8089 connect accept http java sun com products jdk 1 2 docs guide security PolicyFiles html http java sun com products jdk 1 2 docs guide security permissions html Episode 2 Objectifs Machine A Le client Machine B Le serveur MVJ MVJ public class Client public class ServeurDeTaches ServeurDeTaches s Horloge uneHorloge RMI void executer Runnable r t C new Thread r start s executer uneHorloge java_rmi f gt lt Quoi e Comment transmettre les param tres e Comment les r sultats de fonction sont ils retourn s aux clients e Etsi les param tres utilisent des classes inconnues du serveur java_rmi java_rmi Comment gt Aucune incidence sur le source Java except que les parametres transmis doivent tre des instances de java io Serializable toutes les classes Une copie des parametres en profondeur est effectu e pour cela la notion de persistance en Java est utilis e En retour de fonction une copie est galement effectu e Si les parametres sont des instances de classes inconnues du serveur celui ci les demande au client public interface Java io Serializable java_rmi e La signature de la m thode de l i
13. ivationGroup getSystem registerGroup exampleGroup Cr ation ActivationGroup createGroup agi exampleGroup 0 Cr ation d une instance de ActivationDesc cette instance fournit toutes les informations a rmid String location le r pertoire dans lequel se trouve la classe g rant les objets distants location file d jfd rmi ServeurDeTaches_Activatable Serveur le param tre d initialisation ici 1 adapt adapt MarshalledObject m new MarshalledObject new GestionnaireDeTaches monl Cr ation ActivationDesc desc desc new ActivationDesc GestionnaireDistantDeTaches location m java_rmi ServeurDeTaches enregistrement du service Brey GestionnaireDistant monl GestionnaireDistant Activatable register desc au lieu de GestionnaireDistant monl El new GestionnaireDistantDeTaches new GestionnaireDeTaches monl Naming rebind GestionnaireDistant nomDuService System out println le serveur monl GestionnaireDistant nomDuService est enregistre catch Exception e throw e System exit 0 le programme se termine une fen tre li e a rmid mentionne les appels distants java_rmi Les commandes client et serveur Compilation javac et rmic GestionnaireDistantDeTaches Ex cution du serveur set CLASSPATH start rmiregistry start rmid set CLASSPATH d jfd rmi ServeurDeTaches_Activatable
14. local java_rmi 4 Le serveur de t ches diagrammes UML interface Remote interface Gestionnaire extends extends interface UnicastRemoteObject GestionnaireDistant extends implements implements GestionnaireDistant DeTaches GestionnaireDeTaches N Adaptateur RMI Les classes en local l adapt java_rmi 4 local GestionnaireDeTaches Adapt public interface Gestionnaire public void executer Runnable r throws Exception public java util Vector liste throws Exception Contrainte chaque m thode poss de la clause throws Exception java_rmi local GestionnaireDeTaches Adapt public class GestionnaireDeTaches implements Gestionnaire private ThreadGroup table private Vector liste public GestionnaireDeTaches String nom table new ThreadGroup nom liste new Vector public void executer Runnable r throws Exception Thread new Thread table r s t start liste addElement r public java util Vector liste throws Exception return liste java_rmi local Test de adapt public class TestGestionnaireDeTaches public static void main String args throws Exception Gestionnaire monl new GestionnaireDeTaches mon1 monl executer new Horloge monl executer new Horloge Sy stem out printlin me il mon1 liste monl executer new Horloge System out printin monl m
15. ntain nomDuService try serveur Affichagelointain Naming lookup nomComplet serveur methodeLointaine catch Exception e throw e E not rm1 1m186 ou rmi 1m186 1099 ou Im186 1099 est le port par d faut utilis par rmiregistry java_rmi Architecture Machine A Le client Imi27 Machine B Le serveur Imi86 MVJ MVJ R seau AffichageLointain java AffichageLointain class implements implements Client java RMI 2 ServeurDeMethodes java N Client class a ServeurDeMethodes class java_rmi 4 Comment les commandes l interface e L interface est partag e ou recopi e Compilation de l interface commune aux clients et au serveur gt javac AffichageLointain java Le fichier AffichageLointain class est partag entre Imi86 et Imi27 ou recopi sur ces deux machines dans les r pertoires d rmi serveurDeMethodes serveur et d rmi serveurDeMethodes client java_rmi Comment les commandes le serveur e Imi86 d rmi serveurDeMethodes serveur Compilation du serveur gt javac ServeurDeMethodes java gt rmic ServeurDeMethodes Ex cution gt Start rmiregistry attention au CLASSPATH le fichier _ stub doit tre inaccessible par rmiregistry gt java Djava rmi server codebase file D rmi ServeurDeMethodes Serveur Djava security policy java policy ServeurDeMethodes Pour plus d informations sur la console associ e rmiregistry g
16. nterface est e En Java toute instance d une classe impl mentant cette interface est compatible Passage de param tres exemple void executer Runnable r gt Le serveur impl mente cette m thode Exemple la classe Horloge d velopp e par le client public class Horloge extends Thread implements java io Serializable avec public class java lang Thread implements java lang Runnable Le client ServeurDeTaches s Naming lookup Horloge uneHorloge new Horloge s executer uneHorloge S rialisation principes e Le param tre est une instance de java io Serializable public class Horloge extends Thread implements java io Serializable Op rations internes criture par copie de l instance en profondeur lecture de l instance e Ecriture de l instance ce qui est transmis sur le r seau OutputStream out ObjectOutputStream o new ObjectOutputStream out o writeObject uneHorloge Les donn es d instance sont copi es sauf les champs static et transient e Lecture de l instance ce qui est lu depuis le r seau InputStream out N ObjectInputStream o new ObjectInputStream out Horloge uneHorloge Horloge o readObject java_rmi Chargement du class Horloge java public class Horloge extends Thread implements java io Serializable public void run int sec 0 mn 0 h 0 while true LEY ft Thread sleep 100
17. onl liste java_rmi GestionnaireDistant java Adaptateur e D veloppement de adaptateur import java rmi Remote import java rmi RemoteException public interface GestionnaireDistant extends Remote Gestionnaire public static final String nomDuService leserveurDeTaches public void executer Runnable r throws RemoteException Exception public java util Vector liste throws RemoteException Exception Coh rence des 2 interfaces assur e par GestionnaireDistant extends Remote Gestionnaire java_rmi GestionnaireDistantDeTaches java Adaptateur public class GestionnaireDistantDeTaches extends UnicastRemoteObject implements GestionnaireDistant private GestionnaireDeTaches gestionnaire 1 adapt public GestionnaireDistantDeTaches GestionnaireDeTaches gestionnaire throws RemoteException this gestionnaire gestionnaire public void executer Runnable r throws RemoteException Exception gestionnaire executer r public Vector liste throws RemoteException Exception return gestionnaire liste java_rmi ServeurDeTaches java import java rmi public class ServeurDeTaches public static void main String args throws Exception System setSecurityManager new RMISecurityManager try GestionnaireDistant monl new GestionnaireDistantDeTaches new GestionnaireDeTaches mon1 Naming rebind GestionnaireDistant nomDuService monl System out pr
18. t GestionnaireDistantDeTaches ajouter un constructeur d arit 2 en respectant cette signature soit public GestionnaireDistantDeTaches ActivationID id MarshalledObject data super id 0 transmettre ventuellement des param tres d initialisation a1 enregistrement du service soit m new MarshalledObject parametre java_rmi Exemple le gestionnaire de taches e a classe GestionnaireDistantDeTaches Elle doit h riter de la classe Activatable et ajouter le constructeur d arit 2 public GestionnaireDistantDeTaches ActivationID id MarshalledObject data Cette classe sera charg e dynamiquement Usage en interne de getClass et newInstance Le constructeur d arit 2 sera ex cut par rmid Des param tres peuvent tre transmis par interm diaire d une instance de la classe java rmi MarshalledObject MarshalledObject Object parametre extends Object Le param tre est s rialis soit une instance de java io Serializable La m thode get effectue une copie du parametre et celui ci est ensuite d s rialis les autres m thodes sont equals et hashcode java_rmi extends java rmi activation Activatable import java rmi import java rmi activation public class GestionnaireDistantDeTaches extends Activatable java_rmi implements GestionnaireDistant private GestionnaireDeTaches gestionnaire public GestionnaireDistantDeTaches ActivationID id MarshalledObje
19. t java Djava rmi server codebase file D rmi ServeurDeMethodes Serveur Djava rmi server logCalls true Djava security policy java policy ServeurDeMethodes N voir java rmi server RMIClassLoader java_rmi rmic rmi compiler g n ration des fichiers _Skel class et _ Stub class rmiregistry association nom et r f rence Java port 1099 envoi de _ Stub aux clients java Djava rmi server codebase file D rmi ServeurDeMethodes Serveur acc s au _ stub class N Djava security policy java policy en 2 0 contraintes d acces java_rmi Ji Traces du Comment e Traces avec un serveur http 1 dos gt start rmiregistry 2 dos gt start java SimpleHttpd 8080 Cot serveur 1 dos gt java Djava rmi server codebase hitp localhost 8080 ServeurDeMethodes 2 Les traces sur la console du serveur Web LMI93 127 0 0 1 Request GET ServeurDeMethodes_Stub class HTTP 1 1 EMI93 127 0 0 1 Request GET AffichageLointain class HTTP 1 1 java_rmi 4 Comment les commandes le Client e Imi27 d rmi ServeurDeMethodes Client gt javac Client java gt java Djava security policy java policy Client Le serveur Imi86 est r f renc dans le source du Client par nomComplet rmi 1mi86 AffichageLointain nomDuService ey serveur AffichageLointain Naming lookup nomComplet java_rmi Ji Traces du Comment e Traces avec un serveur http Cot client 1 dos gt java Cli
20. t java Djava rmi server codebase http Imi27 8088 D rmi ServeurDeTaches Client Djava security policy java policy TacheCliente e codebase http machine repertoire ftp repertoire java_rmi Exercice modification de TacheCliente java e Modifier TacheCliente java en ajoutant de nouvelles taches ex cut es distance ces taches doivent produire un r sultat lu par le client proposer une solution synchrone et asynchrone V rifier les performances par rapport une version locale Envoyez moi vos r ponses douin cnam fr elles ajouter a la prochaine mouture import java rmi public class TacheClienteEnExercice public static void main String args throws Exceptionf String machine lmi27 if args length 1 machine args 0 System setSecurityManager new RMISecurityManager GestionnaireDistant monl null String nom rmi machine GestionnaireDistant nomDuService try monl GestionnaireDistant Naming lookup nom catch Exception e throw e try monl executer new Tache paraml monl executer new Tache param2 catch Exception e throw e java_rmi Episode 3 e interface vers d autres langages e JNI Java Native Interface Appel d un existant d velopp en C C assembleur Java lt gt C e JDBC Java Data Base Connection Ex cution de requ tes SQL Java lt gt SQL java_rmi JNI RMI
Download Pdf Manuals
Related Search
Related Contents
Enjoy TV Box user manual Assassinato de policial será crime hediondo e qualificado Allsbon Dion Family Wasserionisator Model 6203 Series CA-CALC Combustion Analyzers Operation and Manual Auto Radio AR-02 08-12 Rev 01 Philips 240B4LPYNB Philips 21" TV Employment Services Department Easy System Self Service LU_CompanionPhoto_PC_pt Copyright © All rights reserved.
Failed to retrieve file