Archive for the ‘source-code’ Category

Building PNG Images

Jeudi, septembre 18th, 2008

Did you ever try to build a png image (with a programming language, not an image editor)?  A lot of code sample are available on the internet.  But most if not all are using libpng or some high level libraries like gd.

But what happend if you can’t install libraries on the system where you’re working?  Ever thing about building an image from scratch?  Here is what I do in PHP.

This isn’t the most performant code, but at least it generate a valid PNG image without any non standard libraries.   (Some one could say that zlib or crc are php external libs.. but I haven’t see any php distribution whitout them in a while!)

<?php
/*
* Title: PNG Image Generation
* Author: Jean-Luc Cyr
* Date: 2008-09-17
* License: GNU GPL2
* Description: Generate a simple PNG image
* directly in PHP without using external libs
* like GD.
*/
 
header("content-type: image/png");
 
function long2string($long)
{
$string = chr(($long&0xFF000000)>>24).
chr(($long&0xFF0000)>>16).
chr(($long&0xFF00)>>8).
chr(($long&0xFF)>>0);
return $string;
} // long2string()
function build_png($matrix, $w, $h)
{
////////////////////////////////////////////////////////////////
//PNG Header
$image = chr(0x89).chr(0x50).chr(0x4E).chr(0x47);
$image .= chr(0x0D).chr(0x0A).chr(0x1A).chr(0x0A);
 
////////////////////////////////////////////////////////////////
//Header Chunk
 
//Chunk type
$chunk = "IHDR";
//Chunk data
//Width
$data = long2string($w);
//Height
$data .= long2string($h);
//Depth
$data .= chr(8); //Bits per sample
//Color Type
$data .= chr(2); //RGB
//Compression method
$data .= chr(0);
//Filter method
$data .= chr(0);
//Interlaced method
$data .= chr(0);
 
$crc = crc32($chunk.$data);
//Add length at start
$chunk = long2string(strlen($data)).$chunk.$data;
//Add CRC at the end
//Dump chunk
$chunk = $chunk.long2string($crc);
$image .= $chunk;
 
////////////////////////////////////////////////////////////////
//Data Chunk
 
//Chunk type
$chunk = "IDAT";
//Data (2x2 rgb 8bits)
$s = 3; //samples per pixels
#$matrix  ="\0\0\0\0\0\0\0\0\0";
#$matrix .="\0\0\0\0\0\0\0\0\0";
#$matrix .="\0\0\0\0\0\0\0\0\0";
// No filter so add 0 to beginning of each scan line
$datas = '';
for($c=0; $c<$h; $c++)
$datas .= "\0". substr($matrix,$c*($w*$s),($w*$s));
// Compress Data
#$zdata = gzencode($data,9,FORCE_DEFLATE);
#$zdata = gzdeflate($data,0);
$zdata = gzcompress($datas,0);
// Calculate CRC
$crc = crc32($chunk.$zdata);
// Add length at start
$l = strlen($zdata);
$chunk = long2string($l).$chunk.$zdata;
// Add CRC at the end
$chunk = $chunk.long2string($crc);
$image .= $chunk;
 
////////////////////////////////////////////////////////////////
//End Chunk
 
// Chunk type
$chunk = "IEND";
// Data
$data = "";
// Calculate CRC
$crc = crc32($chunk);
// Add length at start
$chunk = long2string(strlen($data)).$chunk.$data;
// Add CRC at the end
$chunk = $chunk.long2string($crc);
$image .= $chunk;
 
// Send out the image
echo $image;die();
} // build_png()
////////////////////////////////////////////////////////////////
// Demo code
 
// Build a simple image matrix
// 256 x 256 x 8rgb
 
$w=256; // width
$h=256; // height
$s=3;   // 3 x 8 bits samples per pixel (8bits rgb)
for($x=0; $x<$h; $x++)
for($y=0; $y<$w; $y++)
//    for($z=0; $z<$s; $z++) //Ordered R G B
$matrix .=
chr( ( (($y/64)<1) && (($y/64)>0) )?$x:0 ). // R
chr( ( (($y/64)<2) && (($y/64)>1) )?$x:0 ). // G
chr( ( (($y/64)<3) && (($y/64)>2) )?$x:0 ); // B
 
build_png($matrix,$w,$h);
die();
 
////////////////////////////////////////////////////////////////
// Hex dump image for debugging
 
for ($x=0; $x<strlen($image); $x++) {
printf("%02X ",ord($image[$x]));
if ((($x+1)%16)==0)
printf("<br/>");
}

PHP Post

Lundi, avril 28th, 2008

Here a quick example of how-to post some data over the web in a simple php script.

<?php
$datastream = array(
'short_msg'=&gt;'this is a simple message',
'address'=&gt;'98887996662',
);
// create a new cURL resource
$ch = curl_init();
// set URL and other appropriate options
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_URL, <a href="http://psms.canoe-inc.com/send_sms" class="moz-txt-link-rfc2396E">"http://psms.canoe-inc.com/send_sms"</a>);
$o="";
foreach ($datastream as $k=&gt;$v)
{
$o.= "$k=".utf8_encode($v)."&amp;";
}
$post_data=substr($o,0,-1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data);
// grab URL and pass it to the browser
curl_exec($ch);
// close cURL resource, and free up system resources
curl_close($ch);

ASN.1/DER/BER PHP

Mercredi, février 13th, 2008

Je vous ai parlé dernièrement de ASN.1. Voici un petit parseur de base en PHP

 
//Title: Simple PHP BER/DER/ASN.1 basic decoder
//Author: Jean-Luc Cyr
//Date: 2008-02-13
//Desc: Simple BER Printable string dumper
//	read BER data from a file
 
// Set input filename
$filename = 'o';
// Set max number of tag to parse (0 = no limit)
$limit = 0;
 
//Open data file
$f = fopen($filename,'rb');
//Set read tag number to 0
$c=0;
//While not end of file
while(!feof($f))
{
    //Read first block data type
    $type = ord(fread($f,1));
    if ($type==0)
      break;
    //Read first len block
    $len = ord(fread($f,1));
    if ($len==0)
      break;
    $le = 0;
    //If first bit of len is set (1)
    //we have a multiple bit len to read
    if (($len&amp;128)==128)
    {
        echo "Big Len ".($len&amp;127)." Bytes\r\n";
        for ($i = 0; $i &lt; ($len&amp;127); $i++)
          $le = $le * 256 + ord(fread($f,1));
        $len = $le;
    }
    //Findout data type (first 2 bits)
    $cl = ($type &amp; (128+64) ) &gt;&gt; 6;
    switch($cl)
    {
     case 0:
        $cla = 'Universal';
        break;
     case 1:
        $cla = 'application';
        break;
     case 2:
        $cla = 'context-specific';
        break;
     case 3:
        $cla = 'private';
        break;
    }
    //Dump some info
    printf("[$cla] Type: %x (%d), len: %d\r\n",$type,$type,$len);
    //Read data chunk
    $data = fread($f,$len);
    //Display data chunk based on type
    switch($type)
    {
     case 2: // integer
        break;
     case 3: // bit string
        break;
     case 4: // octet string
        break;
     case 5: // null
        break;
     case 6: // object identifier
        break;
     case 16: // sequence and sequence of
        break;
     case 17: // set and set of
        break;
     case 19: //string
        printf("Data: $data\r\n");
        break;
     case 20: // t61string
        break;
     case 22: // ia5string
        break;
     case 23: // utctime
        break;
     default:
        #printf("Data: $data\r\n");
        break;
    }
    //increment count
    $c++;
    //check if we reach the number of tag specified
    if (($c&gt;$limit)&amp;&amp;($limit&gt;0)) break;
}
 
//close our input file
fclose($f);

xmlrpc client (2) - php

Mercredi, juin 22nd, 2005
#!/usr/local/php4/bin/php
 
include "xmlrpc-1.0.99.2/xmlrpc.inc";
 
//First attempt to use XML_RPC calls
//assert( $c=new xmlrpc_client("/", "sundev02.grafsoft.com", 8888) );
assert( $c=new xmlrpc_client("/~jlcyr/rpc_server.php", "192.168.2.21", 80) );
$c-&gt;setDebug(1);//never set it to 1 on an agi script..!!
 
////////////////////
// Envoie d'un fichier binaire
/*
$fn = "01.mp3";
$fich = fopen($fn,"rb");
$select = fread($fich,filesize($fn));
echo "filesize:".filesize($fn)."\n";
fclose($fich);
assert( $f=new xmlrpcmsg('doc.putDoc',array(new xmlrpcval($select,"base64"),new xmlrpcval($fn,"string"))) );
assert( $r=$c-&gt;send($f) );
$v=$r-&gt;value();
if ($r-&gt;faultCode())
  {
    //Insert error flag and message into db
    print "Fault: ";
    print "Code: " . $r-&gt;faultCode() . " Reason '" .$r-&gt;faultString()."'
";
  }
else
  {
    //Dump received return value
    print $v-&gt;scalarval();
  }
*/
 
//////////////////
// Demande des infos du RIS
//assert( $f=new xmlrpcmsg('ris.getCMD',array(new xmlrpcval("9999999","string"),new xmlrpcval("2","string"))) );
assert( $f=new xmlrpcmsg('doc.getDocInfo',array(new xmlrpcval("902","string"),
					    new xmlrpcval("fileset200525","string"),
					    new xmlrpcval("filename1.2.3","string"))));
assert( $r=$c-&gt;send($f) );
$v=$r-&gt;value();
if ($r-&gt;faultCode())
  {
    //Insert error flag and message into db
    print "Fault: ";
    print "Code: " . $r-&gt;faultCode() . " Reason '" .$r-&gt;faultString()."'
";
  }
else
  {
    //Dump received return value
    while (list($key,$item)=$v-&gt;structeach()) {
      print $key."=".$item-&gt;scalarval()."\n";
    }
  }
 
?&gt;

Serveur XML RPC (2) - PHP

Mercredi, juin 22nd, 2005

<?php // Title: Example de serveur XML-RPC en php // Version: 0.2 // Author: Jean-Luc Cyr  // Desc: Replacement for python xml-rpc server that handle //       imagem phone dictation system and audio-context calls.  // Exemple avec l’extension disponible // http://phpxmlrpc.sourceforge.net/  include “xmlrpc-1.0.99.2/xmlrpc.inc”; include “xmlrpc-1.0.99.2/xmlrpcs.inc”;  // Declare global vars  //Setup parameters //Database user name $duser = “transcription”; //$duser = “DICTWEB”; //Database password //$dpass = “password”; $dpass = “imagemsoft”; //Database tnsname //$dhost = “interweb”; $dhost = “rcorcl”; //Document base path //$base_base = “/export/home/dictedoc/”; $base_path = “/export/home/jlcyr/tmp/”;  $db = oci_pconnect($duser,$dpass,$dhost);       // Declare rpc_server possible methods $s=new xmlrpc_server( array(”doc.putDoc” => array (”function” => “doc_putDoc”), 			    “doc.getDocInfo” => array (”function” => “doc_getDocInfo”), 			    “doc.createDoc” => array (”function” => “doc_createDoc”), 			    “doc.getUID” => array (”function” => “doc_getUID”), 			    “doc.updateDOC” => array (”function” => “doc_updateDoc”), 			    “doc.help” => array (”function” => “doc_help”), 			    “ris.getBirth” => array(”function” => “risCMD_getBirth”), 			    “ris.getCMD” => array(”function” => “risCMD_getCMD”), 			    “ris.help” => array(”function” => “risCMD_help”), 			    “sql.execSql” => array(”function” => “sql_execSql”), 			    “sql.getInst” => array (”function” => “sql_getInst”), 			    “sql.help” => array (”function” => “sql_help”) 			    ));  oci_close($db);  // Don’t know why, but seen we can’t pass class method to xmlrpc_server array of function // so i’ve declared stand alone functions  ///////////////////////////////////////////////////////////////////////////////////////// // doc_putDoc invoqué via le web sous doc.putDoc // args: 1-Le contenu du document urlencoded //       2-Le path du media file set a concatener avec le root (global $base_path) //       3-Le nom du fichier à créer // retour: 0 function doc_putDoc($params)//($doc, $path, $filename) {   global $base_path;    $doc=$params->getParam(0)->scalarval();   $path=$params->getParam(1)->scalarval();   $filename=$params->getParam(2)->scalarval();    //Est-ce que le répertoir /export/home/dictedoc/$path existe?   if (!file_exists($base_path.$path))     {       //Si non le créer et le mettre chmod 777       mkdir($base_path.”/”.$path,0777,true);       chmod($base_path.”/”.$path,0777);     }    //Enregistrer le document $doc sous /export/home/dictedoc/$path/$filename   $f = fopen($base_path.”/”.$path.”/”.$filename,”w”);   $data = urldecode($doc);   fwrite($f,$data);   fclose($f);   chmod($base_path.”/”.$path.”/”.$filename,0777);    return new xmlrpcresp(new xmlrpcval(0,”integer”)); }  ///////////////////////////////////////////////////////////////////////////////////////// // doc_getDocInfo invoqué via le web sous doc.getDocInfo // args: le dd_id // retour: toutes les colonnes function doc_getDocInfo($params)//($info) {   global $db;   if ($db==false)       return new xmlrpcresp(new xmlrpcval(”Error connection to db “,”string”));    $info =$params->getParam(0)->scalarval();   $select = “select * from dictation_document where dd_id=’$info’”;   $arr = array();   //Execute select, return result values 1,2,3 in uid, id, fileset   $stmt = oci_parse($db,$select);   if (oci_execute($stmt,OCI_DEFAULT))     {       if (oci_fetch($stmt)) 	{ 	  $ncols = OCINumCols($stmt); 	  for ($i = 1; $i <= $ncols; $i++) { 	    $column_name  = OCIColumnName($stmt, $i); 	    $column_type  = OCIColumnType($stmt, $i); 	    $column_size  = OCIColumnSize($stmt, $i); 	    $column_data = OCIResult($stmt, $i);     	    $arr = $arr + array($column_name => new xmlrpcval($column_data,”string”)); 	  } 	}       else 	{ 	  return new xmlrpcresp(new xmlrpcval(”Error fetching result “,”string”)); 	}     }   else     {       return new xmlrpcresp(new xmlrpcval(”Error executing select “.$select,”string”));     }    return new xmlrpcresp(new xmlrpcval($arr, “struct”)); }  ///////////////////////////////////////////////////////////////////////////////////////// // args: le select à exécuter // retour: string “Doc Created” function doc_createDoc($params)//($select) {   $select = $params->getParam(0)->scalarval();    global $db;   if ($db==false)       return new xmlrpcresp(new xmlrpcval(”Error connection to db “,”string”));    //Execute select, return result values 1,2,3 in uid, id, fileset   $stmt = oci_parse($db,$select);   if (oci_execute($stmt,OCI_DEFAULT))     {       oci_commit($db);     }    //Executer le select dans $select    return new xmlrpcresp(new xmlrpcval(”Doc Created”,”string”)); }  ///////////////////////////////////////////////////////////////////////////////////////// // args: un service id // retour: struct: uid, id et fileset pour créer un nouveau document function doc_getUID($params)//($seruid) {   global $db;   if ($db==false)       return new xmlrpcresp(new xmlrpcval(”Error connection to db “,”string”));    $seruid = $params->getParam(0)->scalarval();    $select = “select ‘2.16.124.10.2.1.3.100.’ “.     “||to_char(sysdate,’YYYYMMDD’)||’.'”.     “||to_char(to_number(to_char(to_date(’010203′,’HH24MISS’),’HH24MISS’)))||’.'”.     “||(select CE_VALUE from config_env where CE_ITEM_CONF=’INSTITUTION’)||’.'”.     “||SQ_DICTATION_UID.NEXTVAL,”.     “to_char(SQ_DICTATION_UID.NEXTVAL), “.     “(select DS_NAME from DICTATION_SERVICE where DS_ID=’$seruid’)||’/'||to_char(sysdate,’YYYYIW’) from dual”;    //Execute select, return result values 1,2,3 in uid, id, fileset   $stmt = oci_parse($db,$select);   if (oci_execute($stmt,OCI_DEFAULT))     {       if (oci_fetch($stmt)) 	{ 	  $uid = oci_result($stmt,1); 	  $id = oci_result($stmt,2); 	  $fileset = oci_result($stmt,3); 	  //oci_commit($this->link); 	}       else 	{ 	  return new xmlrpcresp(new xmlrpcval(”Error fetching result “,”string”)); 	}     }   else     {       return new xmlrpcresp(new xmlrpcval(”Error executing select “.$select,”string”));     }    $arr = array( “uid” => new xmlrpcval($uid,”string”), 		“id” => new xmlrpcval($id,”string”), 		“fileset” => new xmlrpcval($fileset,”string”) );    return new xmlrpcresp(new xmlrpcval($arr, “struct”)); }  ///////////////////////////////////////////////////////////////////////////////////////// // Not done function doc_updateDoc() {   return new xmlrpcresp(new xmlrpcval(”Doc Updated”,”string”)); }  ///////////////////////////////////////////////////////////////////////////////////////// // doc_help invoqué via le web sous doc.help // args: aucun // retour: 1-liste des méthodes de l’objet web doc function doc_help() {   return new xmlrpcresp(new xmlrpcval(”putDoc, getDocInfo, createDoc, getUID, updateDoc”, “string”)); }  ///////////////////////////////////////////////////////////////////////////////////////// // args: un patient id // retour: la date de naissance sous forme de string ou 0 si le patient n’existe pas function risCMD_getBirth($params)//($patid) {   $patid =$params->getParam(0)->scalarval();    $select = “select * from WEB.PATIENT where PAT_ID=’$patid’”;    global $db;   if ($db==false)       return new xmlrpcresp(new xmlrpcval(”Error connection to db “,”string”));    $stmt = oci_parse($db,$select);   if (oci_execute($stmt,OCI_DEFAULT))     {       if (oci_fetch($stmt)) 	{ 	  $birth = oci_result($stmt,”PAT_BIRTH”); 	}       else 	{ 	  return new xmlrpcresp(new xmlrpcval(0, “integer”)); 	  //return new xmlrpcresp(new xmlrpcval(”Error fetching result “,”string”)); 	}     }   else     {       return new xmlrpcresp(new xmlrpcval(0, “integer”));       //return new xmlrpcresp(new xmlrpcval(”Error executing select “.$select,”string”));     }    return new xmlrpcresp(new xmlrpcval($birth, “string”)); }  ///////////////////////////////////////////////////////////////////////////////////////// // args: le staff id et le délai maximum de validité du click dans le ris // retour: toutes les colonnes de la table RIS_DICTATION_INTERFACE function risCMD_getCMD($params)//($staffid, $gap) {   global $db;   if ($db==false)       return new xmlrpcresp(new xmlrpcval(”Error connection to db “,”string”));    $staffid = $params->getParam(0)->scalarval();   $gap = $params->getParam(1)->scalarval();    $select = “select * from RIS_DICTATION_INTERFACE where RDI_STAFF_ID=’$staffid’ and RDI_DT>(sysdate-$gap/(24*60)) order by RDI_DT desc”;    //Execute select, Return all values in the array   $arr = array();   $stmt = oci_parse($db,$select);   if (oci_execute($stmt,OCI_DEFAULT))     {       if (oci_fetch($stmt)) 	{ 	  $ncols = OCINumCols($stmt); 	  for ($i = 1; $i <= $ncols; $i++) { 	    $column_name  = OCIColumnName($stmt, $i); 	    $column_type  = OCIColumnType($stmt, $i); 	    $column_size  = OCIColumnSize($stmt, $i); 	    $column_data = OCIResult($stmt, $i);     	    $arr = $arr + array($column_name => new xmlrpcval($column_data,”string”)); 	  } 	}       else 	{ 	  return new xmlrpcresp(new xmlrpcval(0, “integer”)); 	  //return new xmlrpcresp(new xmlrpcval(”Error fetching result “,”string”)); 	}     }   else     {       return new xmlrpcresp(new xmlrpcval(0, “integer”));       //return new xmlrpcresp(new xmlrpcval(”Error executing select “.$select,”string”));     }    return new xmlrpcresp(new xmlrpcval($arr, “struct”)); }  ///////////////////////////////////////////////////////////////////////////////////////// function risCMD_help() {   return new xmlrpcresp(new xmlrpcval(”getBirth, getCMD”, “string”)); }  ///////////////////////////////////////////////////////////////////////////////////////// // args: l’affirmation sql a exécuter // retour: la string “Sql Done” function sql_execSql($param)//($select) {   global $db;   if ($db==false)       return new xmlrpcresp(new xmlrpcval(”Error connection to db “,”string”));    $select = $params->getParam(0)->scalarval();    //Execute select, with commit   $stmt = oci_parse($db,$select);   if (oci_execute($stmt,OCI_DEFAULT))     {       oci_commit($db);     }    return new xmlrpcresp(new xmlrpcval(”Sql Done”, “string”)); }  ///////////////////////////////////////////////////////////////////////////////////////// // args: N/A // retour: le numéro d’institution défini dans la table config_env sous institution //         ou 0 si non défini. function sql_getInst() {   global $db;   if ($db==false)       return new xmlrpcresp(new xmlrpcval(”Error connection to db “,”string”));    $select = “select CE_VALUE from config_env where CE_ITEM_CONF=’INSTITUTION’”;    //Execute select, return result value in $inst as a string   $stmt = oci_parse($db,$select);   if (oci_execute($stmt,OCI_DEFAULT))     {       if (oci_fetch($stmt)) 	{ 	  $inst = oci_result($stmt,”CE_VALUE”); 	}       else 	{ 	  return new xmlrpcresp(new xmlrpcval(0, “integer”)); 	  //return new xmlrpcresp(new xmlrpcval(”Error fetching result “,”string”)); 	}     }   else     {       return new xmlrpcresp(new xmlrpcval(0, “integer”));       //return new xmlrpcresp(new xmlrpcval(”Error executing select “.$select,”string”));     }    return new xmlrpcresp(new xmlrpcval($inst, “string”)); }  ///////////////////////////////////////////////////////////////////////////////////////// function sql_help() {   return new xmlrpcresp(new xmlrpcval(”execSql, getInst”, “string”)); }  //Exemple de retour de message d’erreur //return new xmlrpcresp(0, $xmlrpcerruser+3, “Select return an error”); //return new xmlrpcresp($retVal);//OK 


 

Windows tray application

Lundi, mai 30th, 2005

<h3>Voici un exemple de code pour mettre un programme dans le system tray (à coté de l’heure) dans windows.</h3> <br> Il est basé sur un programme en mode dialog.<br> <br> Pour commencer dans le <b>’initinstance’</b> modifier la création de la dialogue de la manière suivante: <pre style=”background-color: #FFF8ED”> //int nResponse = dlg.DoModal(); dlg.Create(IDD_AUDIOCONTEXT_DIALOG); dlg.ShowWindow(SW_HIDE); int nResponse = dlg.RunModalLoop(); dlg.DestroyWindow(); </pre> Par la suite modifier la classe de la dialog des manières suivantes: Ajouter une définition <pre style=”background-color: #FFF8ED”> #define MYWM_NOTIFYICON (WM_USER+2) </pre> A la fin du <b>OnInitDialog(…)</b> <pre style=”background-color: #FFF8ED”> TrayMessage(NIM_ADD); ShowWindow(SW_HIDE); </pre> A la fin du <b>DestroyWindows(…)</b> <pre style=”background-color: #FFF8ED”> TrayMessage(NIM_DELETE); </pre> Ajouter la fonction suivante: <pre style=”background-color: #FFF8ED”> ///////////////////////////////////////////////////////////////////////////// // Supported message // NIM_ADD, NIM_DELETE, NIM_MODIFY BOOL CAudioContextDlg::TrayMessage( DWORD dwMessage, unsigned int icone/*=IDR_TRAYICON*/) { CString sTip(_T(”AudioContext”)); NOTIFYICONDATA tnd; tnd.cbSize = sizeof(NOTIFYICONDATA); tnd.hWnd = m_hWnd; tnd.uID = IDR_TRAYICON; tnd.uFlags = NIF_MESSAGE|NIF_ICON; tnd.uCallbackMessage = MYWM_NOTIFYICON; tnd.uFlags = NIF_MESSAGE|NIF_ICON|NIF_TIP; VERIFY( tnd.hIcon = LoadIcon(AfxGetInstanceHandle(), MAKEINTRESOURCE (icone)) ); lstrcpyn(tnd.szTip, (LPCTSTR)sTip, sizeof(tnd.szTip)); return Shell_NotifyIcon(dwMessage, &tnd); } </pre> Créer dans les ressources du projet une icone nommée IDR_TRAYICON vous pouvez aussi créer un menu avec un sous menu qui sera appellé par l’icone avec le bouton de droite, il suffit de créer le menu dans les ressources et d’ajouter ce code <pre style=”background-color: #FFF8ED”> ///////////////////////////////////////////////////////////////////////////// void CAudioContextDlg::TrayMenu(void) { BOOL bResult = FALSE; DWORD SelectionMade; CMenu menu; CString csMessage; int nIndex = 0; long nRecordNumber = 0; long nAbsolutePosition = 0; bResult = menu.LoadMenu(IDR_MENU_POPUP); CMenu* popup = menu.GetSubMenu(0); // menuRtClick.EnableMenuItem(ID_ITEM0, TRUE); // menuRtClick.EnableMenuItem(ID_ITEM1, TRUE); // menuRtClick.EnableMenuItem(ID_ITEM2, TRUE); // call the helper function to setup this as a titled popup menu // AddMenuTitle(popup); POINT pp; GetCursorPos(&pp); SetForegroundWindow(); SelectionMade = popup->TrackPopupMenu( TPM_LEFTALIGN | TPM_LEFTBUTTON | TPM_RIGHTBUTTON | TPM_NONOTIFY | TPM_RETURNCMD, pp.x,pp.y,this); popup->DestroyMenu(); // The value of SelectionMade is the id of the command selected or 0 if no // selection was made switch(SelectionMade) { case ID_POPUP_QUIT: OnOK(); break; case ID_POPUP_SHOW: ShowWindow(SW_NORMAL); SetForegroundWindow(); SetFocus(); break; case ID_POPUP_CONTEXT: OnQuery() ; break; case ID_POPUP_ENVOYER: OnSend(); break; } } </pre> Pour gérer tout ça, il faut égallement ajouter un bout de code dans la fonction DefWinProc(…) <pre style=”background-color: #FFF8ED”> case MYWM_NOTIFYICON: { switch (lParam) { case WM_LBUTTONDOWN: { if (::MessageBox(NULL,”Voulez-vous transmettre cette dictée?”,”Transmettre”,MB_YESNO)==IDYES) { OnSend(); } return TRUE; } case WM_LBUTTONDBLCLK: switch (wParam) { case IDR_TRAYICON_PA: ShowWindow(SW_NORMAL); SetForegroundWindow(); SetFocus(); return TRUE; break; } case WM_RBUTTONDOWN: switch (wParam) { case IDR_TRAYICON_PA: //Beep(1000,100); TrayMenu(); break; } break; } } break; </pre> Le code de ce programme est basé sur la fonction shell_notifyicon dont la documentation est disponible à <a href=”http://msdn.microsoft.com/library/default.asp?url=/library/en-us/shellcc/platform/shell/reference/functions/shell_notifyicon.asp”>Documentation</a> <br> <br> La majorité du code de cet exemple provient de <a href=”http://www.codeguru.com/Cpp/controls/controls/systemtray/article.php/c5309/”>Code Guru</a> et de <a href=”http://www.codeproject.com/shell/mfcstartup.asp”>Code Project</a>

Update PowerDNS

Vendredi, mai 20th, 2005

Ce script reçoit en paramètre le mot de passe du compte Il se connecte à un serveur web sur lequel est installer PowerDNS et met à jour un enregistrement. <pre> #!/bin/bash ################################################################ # # Author: Jean-Luc Cyr # Copyright 2004 / ADN Informatique # Date: 2004-09-27 # Desc: PowerDNS Administration automatic DNS record update # from a GNET router dynamic IP configuration # ################################################################ #GNET ROUTER INTERNAL IP ROUTER_IP=1.2.3.4 #PowerDNS Administration server url DNS_SERVER= mydomain.com/powerdns DNS_USER=username DNS_PASS=$1 DNS_RECORD=33643 if [ $1 ] ; then echo “” >/dev/null ; else echo “must give password”; exit; fi DNS_LOGIN=”username=$DNS_USER&password=$DNS_PASS&submit=Log%20in” cd /tmp #date if [ -f status.htm ] ; then rm status.htm ; fi if [ -f oldip ] ; then rm oldip ; fi if [ -f currentip ] ; then cp currentip oldip ; fi #echo =======Get router status page======================= wget -q http://$ROUTER_IP/status.htm #echo =======Find out the router ip address=============== if [ -f status.htm ] ; then cat status.htm | grep “IP Address” | cut -b 41- | cut -f1 -d”<” > currentip ; else exit ; fi #date >>/tmp/currentip #echo =======Check if router address has changed========== #if diff -q oldip currentip | grep differ >/dev/null ; then echo “ROUTER IP HAS CHANGED” ; else echo “ROUTER IP HAS NOT CHANGED” ; exit ; fi if diff -q oldip currentip | grep differ >/dev/null ; then echo “ROUTER IP HAS CHANGED” ; else echo “” >/dev/null ; exit ; fi #echo =====================LOGGING IN===================== #Call the login page: http://ns1.lcinter.net/dns2/index.php (user/pass/submit) curl -D headers_and_cookies -d $DNS_LOGIN $DNS_SERVER/login.php 2>/dev/null #echo =====================GETTING RECORD================= #Call the update record page: http://ns1.lcinter.net/dns2/edit_record.php?id=33643 (dns data/submit) curl -b headers_and_cookies $DNS_SERVER/edit_record.php?id=$DNS_RECORD 2>/dev/null | grep content | grep name= | cut -b 74- | cut -f1 -d”<” > /tmp/dnsip #if diff -q dnsip currentip | grep differ >/dev/null ; then echo “DNS DIFFER FROM ROUTER IP” ; else echo “DNS IS UP TO DATE” ; curl -b headers_and_cookies $DNS_SERVER/logout.php ; exit ; fi if diff -q dnsip currentip | grep differ >/dev/null ; then echo “DNS DIFFER FROM ROUTER IP” ; else echo “” >/dev/null ; curl -b headers_and_cookies $DNS_SERVER/logout.php 2>/dev/null ; exit ; fi echo =====================UPDATING RECORD================ date #Call the update record page #Here are en example of the original update page from PowerDNS #<form action=”update_record.php?id=33643″ method=”post”> # <input type=”text” name=”record” size=”15″ maxlength=”200″ value=”home”>.adninformatique.net # <select name=”type”> # <option value=”NS”>NS</option> # <option value=”MX”>MX</option> # <option value=”A” selected>A</option> # <option value=”AAAA”>AAAA</option> # <option value=”PTR”>PTR</option> # <option value=”CNAME”>CNAME</option> # <option value=”TXT”>TXT</option> # </select> # <input type=”text” name=”prio” size=”5″ maxlength=”11″ value=”"> # <input type=”text” name=”content” size=”15″ maxlength=”255″ value=”24.201.6.204″> # <input type=”text” name=”ttl” size=”5″ maxlength=”11″ value=”1″> # <input type=”submit” value=”Update”> #</form> echo update adni.adninformatique.net dns DNS_REQ=”record=home&type=A&prio=&ttl=1&submit=Update&content=`cat /tmp/currentip`” #echo request is $DNS_REQ curl -b headers_and_cookies -d $DNS_REQ $DNS_SERVER/update_record.php?id=$DNS_RECORD >/dev/null 2>/dev/null echo update jlcyr.dyn.grafsoft.com dns curl www.grafsoft.com/~jlcyr/dns_update.php?ip=24.201.6.204 >/dev/null 2>/dev/null #grep “The record was updated” #echo =====================LOGGING OUT==================== #Call the logout page: http://ns1.lcinter.net/dns2/logout.php curl -b headers_and_cookies $DNS_SERVER/logout.php 2>/dev/null rm -f headers_and_cookies echo “dynamic ip updated” </pre> <dtml-var standard_html_header> <h2><dtml-var title_or_id></h2> <p> This is the <dtml-var id> Document. </p> <dtml-var standard_html_footer>

DICOM images downloader and cd burner

Vendredi, avril 8th, 2005

#!/usr/bin/python2.2  # Title: CDs.py # Descr: Retrieve images from IMAGEM PACS (Oracle/FTP) #        build up a dicomdir file # Author: Jean-Luc Cyr # License: (C)2005 Jean-Luc Cyr / Les systèmes médicaux IMAGEM # Created: 2005-04-08 # # Require: DCMTK utilities (dcmdjpeg, dcmconv, dcmgpdir)   # Oracle connection settings db_user = “ris_pacs” db_pass = “password” db_host = “rpdev” # FTP retrieve connection settings ftp_user = “robin” ftp_pass = “blitzkrieg” ftp_host = “192.168.2.70″  # Imports and defs ftp = “ftp://%s:%s@%s” % (ftp_user, ftp_pass, ftp_host) import cx_Oracle as db from urllib import urlretrieve import commands from os import stat  #program start HERE  #Ask for a patient id to fetch study list for patid = raw_input(”Enter Pat ID:”)  #Connect to db con = db.connect(db_user, db_pass, db_host) cur = con.cursor()  #Fetch study list for this patient cur.execute(”select STU_DATE, STU_DESC, STU_INSTANCE_UID from study where stu_pat_id=’%s’ order by stu_date desc” % patid)  study = cur.fetchall()  for row in range(0,study.__len__()):     (date,desc,stuuid) = study[row]     print “%s - %s - %s” % (row+1,date,desc)  #Ask for studies to burn (index from returned list) studylist = raw_input(”Enter Study (comma separated):”)  stunolist = studylist.split(”,”) stulist=”" for stuno in stunolist:     #stulist.insert(1,study[int(stuno)][2])     if stulist.__len__()>0:         stulist = “%s,’%s’” % (stulist,study[int(stuno)-1][2])     else:         stulist = “‘%s’” % study[int(stuno)-1][2];  #Fetch image list (for all studies) select = “select MFS_MOUNT_POINT,COI_STUDY_INSTANCE_UID,COI_SERIES_INSTANCE_UID,COI_SOP_INSTANCE_UID from composite_object_instance,media_file_set where coi_study_instance_uid in (%s) and coi_sto_media_fset_uid = mfs_uid” % (stulist) cur.execute(select) coi = cur.fetchall()  #clean up last dicomdir and files op = commands.getoutput(”rm *dcm”) op = commands.getoutput(”rm DICOMDIR”) op = commands.getoutput(”rm image.iso”)  #Fetch images, convert them to the good uncompressed format #and build up the DICOMDIR file imlist=[] for row in range(0, coi.__len__()):     print “=== %s de %s ===” % (int(row)+1,coi.__len__())     (mfsuid,stuuid,seruid,coiuid) = coi[row]     url = “%s/%s/%s/%s/%s.dcm” % (ftp,mfsuid,stuuid,seruid,coiuid)     fileName = “%sdcm” % (row)     imlist.insert(1,”%s.dcm” % (coiuid))     print “*Retrieving %s” % coiuid     try:         urlretrieve(url,fileName);     except IOError:         print “Can’t retrieve file”     else:         path = “/home/jlcyr/old_home/Devel/CDs”;          print ‘*Uncompressing’             op = commands.getoutput(”dcmdjpeg +te %s %s” % (fileName,fileName))         if op!=”":             print op          print ‘*Converting to LittleEndianExplicit’         op = commands.getoutput(”dcmconv +te %s %s” % (fileName,fileName))         if op!=”":             print op          try:             stat(”DICOMDIR”)         except OSError:#file doesn’t exist             print ‘*Creating DICOMDIR’             op = commands.getoutput(”dcmgpdir +m +D DICOMDIR %s” % (fileName))             if op!=”":                 print op                 op = commands.getoutput(”rm %s” % (fileName))         else:             print ‘*Adding to DICOMDIR’                         op = commands.getoutput(”dcmgpdir +A +m +D DICOMDIR %s” % (fileName))             if op!=”":                 print op                 op = commands.getoutput(”rm %s” % (fileName))  #Now burn the CD! print “==== Making ISO image ====” op = commands.getoutput(”mkisofs *dcm DICOMDIR >image.iso”) print op 


 

Dicom Worklist

Vendredi, avril 1st, 2005
#!/usr/bin/python2.3 # # Script to download a worklist file # and fetch each enumerated file # # author: Jean-Luc Cyr # created on : 2005-06-16 # for: Les systemes medicaux IMAGEM inc #   from urllib import urlopen, urlretrieve from os import makedirs, stat  #Variables globales method = “http://” listserver = “192.168.2.21″ path = “/worklist/” inst = “CHUL” fileserver = “ftp://robin:blitzkrieg@192.168.2.70/” rootdir = “/home/jlcyr/dl/”  #Fonction pour downloader la liste de travail a partir du web def fetchlistweb():     print ‘Retrieving worklist’     url = method + listserver + path + “worklist.php?INST_ID=” + inst     #print url     try:         page = urlopen(url).read()     except IOError:         print “Can’t connect to server”         page = “Can’t connect to server”     return page;  #Fonction pour downloader la liste de travail a partir de la db def fetchlistdb():     import cx_Oracle     list = “<PRE>#Liste de travail pour: CHUL\n”     destination=’CHUL’     conn2 = cx_Oracle.connect(’ris_pacs’,'password’,'rpdev’)     cur2 = conn2.cursor()     select = “SELECT /*+ INDEX(c IDX_COI_STUDY_UID) */ DISTINCT a.AR_START_DOWNLOAD, c.COI_PAT_ID, c.COI_DATE, m.MFS_MOUNT_POINT,a.AR_STU_INSTANCE_UID, c.COI_SERIES_INSTANCE_UID, c.COI_SOP_INSTANCE_UID || ‘.dcm’, s.STU_DESC FROM AUTO_ROUTING a, COMPOSITE_OBJECT_INSTANCE c, MEDIA_FILE_SET m, STUDY s WHERE COI_STUDY_INSTANCE_UID = AR_STU_INSTANCE_UID AND  COI_STO_MEDIA_FSET_UID = MFS_UID AND AR_STATUS = ‘CREATED’ AND  AR_DESTINATION = ‘%s’ AND COI_TYPE = ‘IMAGE’  AND AR_START_DOWNLOAD <= SYSDATE AND COI_STUDY_INSTANCE_UID = STU_INSTANCE_UID UNION SELECT /*+ INDEX(c1 IDX_COI_STUDY_UID) */ DISTINCT a.AR_START_DOWNLOAD, c2.COI_PAT_ID, c2.COI_DATE, m.MFS_MOUNT_POINT, c2.COI_STUDY_INSTANCE_UID, c2.COI_SERIES_INSTANCE_UID, c2.COI_SOP_INSTANCE_UID || ‘.dcm’, s2.STU_DESC FROM AUTO_ROUTING a, COMPOSITE_OBJECT_INSTANCE c1, STUDY s1, HISTORICAL_IMAGES h, STUDY s2, COMPOSITE_OBJECT_INSTANCE c2, MEDIA_FILE_SET m WHERE a.AR_STATUS = ‘CREATED’ AND  a.AR_DESTINATION = ‘%s’ AND a.AR_START_DOWNLOAD <= SYSDATE AND c1.COI_STUDY_INSTANCE_UID = a.AR_STU_INSTANCE_UID AND c1.COI_TYPE = ‘IMAGE’ AND a.AR_STU_INSTANCE_UID = s1.STU_INSTANCE_UID AND s1.STU_OTHER_NUMBER = h.HI_REF_EXAMCODE AND h.HI_EXAMCODE = s2.STU_OTHER_NUMBER AND s1.STU_PAT_ID = s2.STU_PAT_ID AND s1.STU_INSTANCE_UID != s2.STU_INSTANCE_UID AND s2.STU_INSTANCE_UID = c2.COI_STUDY_INSTANCE_UID AND c2.COI_TYPE = ‘IMAGE’ AND  c2.COI_STO_MEDIA_FSET_UID = m.MFS_UID ORDER BY 1  asc, 2, 3 desc” % (destination, destination)     items = 8     cur2.execute(select)     res2 = cur2.fetchall()     result={}     study = “”     for item in range(1,cur2.rowcount):         for cnt in range(0,items):             result[cur2.description[cnt][0]] = res2[item][cnt]         if (study!=result[’AR_STU_INSTANCE_UID’]):             if (study!=”"):                 list += “End of Study:  ”                 list += study                 list += “\n”             study=result[’AR_STU_INSTANCE_UID’]             list += “Start of Study:  ”             list += study             list += “\n”         list += “%s/%s/%s/%s\n” % (result[’MFS_MOUNT_POINT’],result[’AR_STU_INSTANCE_UID’],result[’COI_SERIES_INSTANCE_UID’],result[”C.COI_SOP_INSTANCE_UID||’.DCM’”])     if (study!=”"):         list += “End of Study:  ”         list += study         list += “\n”     list += “</PRE>”     return list  #Fonction mettre des entrees dans la liste de travail def makedb():     print “Generation d’une liste de travail”     import cx_Oracle     conn2 = cx_Oracle.connect(’ris_pacs’,'password’,'rpdev’)     cur2 = conn2.cursor()     select = “update AUTO_ROUTING set AR_STATUS=’CREATED’”     cur2.execute(select)     select = “commit”     cur2.execute(select)  #Fonction pour updater la liste de travail quand une etude est downloade def updatelist(study):     print “Updating worklist for study %s ” % ( study )     url = method + listserver + path + “update_worklist.php?STU_INSTANCE_UID=” + study     #print url     try:         page = urlopen(url).read()     except IOError:         print “Can’t connect to server”         page = “Can’t connect to server”     print “response:%s” % ( page )  #Fonction pour downloader une image, verifier les directory etc def download(full,stu,ser,file):     url = fileserver+full     try:         stat(rootdir+stu+”/”+ser)     except OSError:         print “Local directory doesn’t exist, creating it (%s)” % (rootdir+stu+”/”+ser)         makedirs(rootdir+stu+”/”+ser)      print “Retrieving object %s” % (file)     fileName= “%s%s/%s/%s” % ( rootdir, stu, ser, file )     try:         urlretrieve(url,fileName);     except IOError:         print “Can’t connect to server”             print ‘Done’  #Fonction pour executer une liste de travail (downloader les images et updater a chaque etude) def parse(page):     print ‘Parsing worklist’     lines = page.split(”\n”)     for line in lines:         #print line         compo = line.split(’/')                 if line[0]==’/':             download(line,compo[3],compo[4],compo[5])         else:             if (line[0:3]==”End”):                 compo = line.split(’:  ‘)                 print line                 updatelist(compo[1])             if (line[0:5]==”Start”):                 print line  #Programme principal makedb() print ‘Starting download’ #parse(fetchlistweb()) parse(fetchlistdb()) print ‘All work done’