Récupérer le numéro de téléphone de la carte SIM d'un appareil Windows Mobile

Pour récupérer le numéro de téléphone contenu dans la carte SIM de notre appareil Microsoft Windows Mobile, nous allons avoir besoin d’une DLL managée qui se nomme TapiLib.dll Disponible à cette adresse : http://iow4.net/public/TapiLib.rar

Note : le SDK de développement pour SmartPhone doit être installé sur votre système et vous devez posséder Visual Studio.

Une fois le téléchargement de la DLL terminé et le pré-requis précédent rempli, voici la marche à suivre pour créer un projet :

  1. Créez un nouveau projet Visual C# SmartDeviceApplication
  2. Ouvrez l’explorateur de solution, faite un clique droit sur Références puis Add Reference
  3. Cliquez sur Browse… et sélectionnez la DLL TapiLib à l’endroit ou vous l’avez téléchargé précédemment
  4. La DLL est ajoutée, Il faut maintenant inclure le namespace, ouvrez votre fichier de code et ajouté en haut :
using OpenNETCF.Tapi;

Une fois la DLL incluse et le namespace ajouté, vous pouvez commencer à utiliser la DLL dans votre code. Cependant même avec TapiLib remplissant le rôle de couche d'abstraction, la récupération du numéro de téléphone n'est pas simple et nécessite quelques vérifications, c'est pourquoi nous allons avoir recourt à une fonction managée à inclure dans votre fichier de code CSharp Cette fonction ne prendra pas de paramètres mais en revanche retournera un string contenant le numéro de téléphone directement.

string num() 
{ 
	Tapi tapi = new Tapi(); 
	tapi.Initialize(); 
 
	Hashtable DeviceCaps; 
	int deviceIDCell = -1; 
	DeviceCaps = new Hashtable(); 
	string szPhoneNumber = ""; 
 
	for( int i = 0; i < tapi.NumDevices; i++ ) 
	{ 
		LINEDEVCAPS dc = new LINEDEVCAPS(1024); 
		dc.Store(); 
		int dwVersion = tapi.NegotiateVersion(i); 
		int ret = NativeTapi.lineGetDevCaps(tapi.hLineApp, i, dwVersion, 0, dc.Data); 
		if ( ret < 0 ) 
			continue; 
		if ( (LINEERR)ret == LINEERR.STRUCTURETOOSMALL ) 
		{ 
			dc.Data = new byte[dc.dwNeededSize]; 
			ret = NativeTapi.lineGetDevCaps(tapi.hLineApp, i, dwVersion, 0, dc.Data); 
		} 
		dc.Load(); 
 
		if (dc != null && dc.ProviderName == CellTSP.CELLTSP_PROVIDERINFO_STRING) 
		{ 
			LINEADDRESSCAPS ac = new LINEADDRESSCAPS(1024); 
			ac.Store(); 
			ret = NativeTapi.lineGetAddressCaps(tapi.hLineApp, i, 0, dwVersion, 0, ac.Data); 
			ac.Load(); 
			szPhoneNumber = Encoding.Unicode.GetString(ac.Data, ac.dwAddressOffset, ac.dwAddressSize); 
 
			ac = null; 
			deviceIDCell = i; 
			break; 
		} 
	} 
 
	if (deviceIDCell == -1) // Not found 
		MessageBox.Show("Could not find cellular line"); 
 
	tapi.Shutdown(); 
	return szPhoneNumber; 
}

Cette fonction (un peu modifiée) est issue de l’exemple fournit avec la DLL.

Pour obtenir le numéro de téléphone il suffit maintenant d'appeler la fonction num();

Comment utiliser plusieurs base de données avec Symfony ?

La documentation de Symfony est assez vague à ce sujet, comment gérer plusieurs base de données avec Symfony ?

Nous allons étudier un cas pratique, on dispose de deux base de données MySQL (la procédure peut cependant être étendu aux autres SGBD compatible) appelées base1 et base2. Ces deux bases de données contiennent toutes deux des tables matérialisées par ce schéma :

  • Base de données : base1
    • Table : user1
    • Table : test1
  • Base de données : base2
    • Table : user2
    • Table : test2

Le livre Symfony nous dit :

You can have more than one schema per application. Symfony will take into account every file ending with schema.yml or schema.xml in the config/ folder. If your application has many tables, or if some tables don't share the same connection, you will find this approach very useful

En simple, il est possible d'avoir plusieurs schemas de base de données dans le répertoire config à condition que le nom de ces derniers se termine par schema.yml ou schema.xml

Il est donc possible d'utiliser un schema par base de données avec un identifiant de connexion différent par schéma.

Il faut donc créer un schéma représentatif des tables par base de données et il faut que le nom de ces schémas se termine par schema.yml ou schema.xml La génération des schémas ne sera pas traitée dans cet article, cet article suppose que le schéma des tables de la base1 se trouve dans le fichier base1-schema.xml et pour la base2 dans le fichier base2-schema.xml (les fichiers peuvent être en yaml ou xml peut importe..)

Une fois que les schémas sont crées, il faut maintenant leur donner un identifiant de connexion, comment ? En Yaml c'est la première ligne qui détermine l'identifiant qui sera utilisé (décrit dans le fichier database.yml, nous verrons plus tard) En XML c'est l'attribut name de la balise database

Après avoir définit les schémas avec les identifiants de connexion appropriés, il faut définir ces derniers dans le fichier config/databases.yml pour chaque identifiant de connexion vous devez créer un paragraphe dans l'espace de nom all portant le nom de ce dernier.

Chaque identifiant doit contenir au moins 2 informations :

  1. La class à utiliser pour gérer la base de données (par defaut sfPropelDatabase)
  2. Un sous espace de nom contenant l'attribut dsn permettant de spécifier l'adresse du serveur, le protocole à utiliser, l'utilisateur à choisir ainsi que le mot de passe sous la forme

protocole://utilisateur:mot de passe@adresse du serveur/base de données à utiliser

Ce qui donnera dans notre exemple, en supposant que nous utilisons MySQL en local avec l'user toto et le mot de passe azerty et que nous voulons sélectionner la base1 :

mysql://toto:azerty@localhost/base1

Voici un fichier databases.yml conforme avec notre exemple de départ :

all:
  base1:
    class:   sfPropelDatabase
    param:
      dsn:     mysql://root@localhost/base1
 
  base2:
    class:   sfPropelDatabase
    param:
      dsn:     mysql://root@localhost/base2

Vous l'aurez compris les identifiants de base de données sont ici base1 et base2

Vous devez maintenant vider le cache symfony pour prendre en compte les modifications (symfony cc dans un shell) Et vous pouvez utiliser la fameuse fonction symfony propel-build-model pour construire les class définit grâce aux fichiers schémas.