Mai demult am facut o aplicatie in Silverlight care arata iconitele oamenilor din Yahoo messenger intr-o animatie simpaticuta zic eu. Si messengerul le pastreaza pe toate. Pentru ca eu nu am liniste si am mereu idei, vroiam sa vad daca pot sa construiesc o aplicatie Silverlight cu o aplicatie de desktop, si sa aiba parti interschimbabile. Am facut un test, si proiectul ala a fost o tinta buna, asa ca uite ca am facut o mini aplicatie.

Va rog cititi mai departe, ca la sfarsit e si un tag, ca m-ati innebunit cu ale voastre. Si in plus sunt curios. Tagul e Kalin style totusi.

Bun, Silverlightul e o arhiva, asa ca aplicatia genereaza acea arhiva cu imaginile salvate din Yahoo (nu conteaza daca aveti windows pe 32 sau 64 de biti) de pe toate hardurile. Cauta doar in directoarele default, deci nu dureaza mult. Setarile default sunt ok, dar se poate experimenta cu ele. Just click go.


Programul e safe, nu are magarii, puteti sa va uitati in arhiva rezultata, nu apare nici o informatie personala in afara de acele imagini. O sa pun si codul mai jos, dar probabil ca majoritatea nu o sa-l cititi.

Programul se ia de AICI. Se dezarhiveaza si ruleaza executabilul. Da, are nevoie de toate fisierele.

Dupa ce se apasa GO vor rezulta doua fisiere. Unul cu extensia xap si unul cu extensia html. Html-ul e doar pentru preview. Daca zice acolo ca trebuie instalat silverlight, instalati Silverlight. E ok, e de la Microsoft. Daca nu merge programul downloadat inseamna ca aveti nevoie de .Net 2.0. Daca nu-l aveti luati-l si pe ala. Dar ar cam trebui sa-l aveti.

Care e partea de munca ? Pai hostingul. Se merge aici https://silverlight.live.com/account/manage.aspx si se face un cont daca nu aveti deja un cont pe Windows Live. Se poate folosi orice mail de la oricine. Nu trebuie facut cont de hotmail. O sa vina un mail de confirmare, click, finish, si ne putem apuca.

Se merge la http://www.microsoft.com/silverlight/resources/streaming.aspx Get it free. La un moment dat apare optiunea de Manage Application. Click. Vrem sa uploadam o aplicatie. Se da un nume, si se uploadeaza fisierul xap. Dupa ce s-a uploadat click pentru crearea fisierului de configurare, se alege latimea si inaltimea cu care vreti sa apara pe blog, si gata.

Sub Method 1 apare niste cod, copy-paste pe blog in html. Asta e codul meu ca exemplu:
<iframe src=”http://silverlight.services.live.com/invoke/90487/muhaha/iframe.html” scrolling=”no” frameborder=”0″ style=”width:320px; height:600px”></iframe>

Atentie, wordpressul are tendinta sa stearga codul aiurea in tramvai daca comuta pe Visual mode. Deci bagati-l ultimul.

Tagul pleaca de aici la Ina, Myke, Laura, Melina si Liana. L-as pune si pe Dan dar el nu mai are nimic pe calculator. Hai sa va vad.

Pentru buguri contactati-ma pe mess sau pe blog. Dar nu cred ca o sa fie probleme.

Mai departe e doar partea tehnica.

Cum ziceam fisierul xap de siverlight e o arhiva zip. Daca muti toatae chestiile de confiurare in afara dll-urilor, esti ok. Nu prea merge sa citesti fisiere normale, trebuie sa fie xml-uri.

XElement xe = XElement.Load("Images.txt");

Imaginile si fisierele de confiurare sun setata ca fiind “content”. Imaginile se incarca usor si prietenos.

image.Source = new BitmapImage(new Uri(url,UriKind.Relative));

In rest nu am schimbat mare lucru in aplicatia Silverlight.

Cum arata codul programului care construieste aplicatai ? Cam asa, nu m-am chiniut sa-l optimizez. Am fost magar pe alocuri, dar give me break. e un program facut in 2 ore.

namespace ImageSpace3DBuilder
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
saveFileDialog1.Title = "Where to save your animation";
saveFileDialog1.OverwritePrompt = true;
saveFileDialog1.SupportMultiDottedExtensions = false;
saveFileDialog1.DefaultExt = "xap";
saveFileDialog1.Filter = "silverlight file (*.xap)|*.xap";
saveFileDialog1.AddExtension = true;
label1.Text = "";
}
 
private void button1_Click(object sender, EventArgs e)
{
 
if (saveFileDialog1.ShowDialog() == DialogResult.OK)
{
String filename = saveFileDialog1.FileName;
 
process(filename);
}
}
 
private void process(string filename)
{
List files = new List();
 
getMessFiles(files);
 
Dictionary dict = new Dictionary();
 
getUniqueFiles(files, dict);
 
int filterredNoOfFiles = dict.Count();
label1.Text += " - Unique files: " + filterredNoOfFiles;
 
String here = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location);
 
KeyValuePair[] list = createConfigs(dict, here);
 
createZip(here, filename, list);
 
StreamReader html = new StreamReader(here + "\\files\\Testpage.html");
string content = html.ReadToEnd();
html.Close();
 
StreamWriter htmlout = null;
byte[] htmlarray = new byte[4096];
 
if (!filename.Equals(filename.Replace(".xap", ".html")))
{
htmlout = new StreamWriter(filename.Replace(".xap", ".html"));
 
content = Regex.Replace(content, "here_comes_the_file", filename.Split('\\').Last());
 
htmlout.Write(content);
 
}
else
MessageBox.Show("The HTML file was not created because it would replace the application files");
 
html.Close();
try
{
htmlout.Close();
Process.Start(filename.Replace(".xap", ".html"));
}
catch{}
 
}
 
private void createZip(string here, string filename, KeyValuePair[] list)
{
FileStream file = new FileStream(filename, FileMode.Create, FileAccess.ReadWrite);
ZipOutputStream zos = new ZipOutputStream(file);
zos.Close();
file.Close();
file = new FileStream(filename, FileMode.Open, FileAccess.ReadWrite);
ZipFile fil = new ZipFile(file);
fil.BeginUpdate();
 
foreach(KeyValuePair element in list)
fil.Add(element.Value, "images\\" + element.Value.Split('\\').Last());
 
fil.Add(here + "\\files\\AppManifest.xaml","AppManifest.xaml");
fil.Add(here + "\\files\\System.Windows.Controls.dll","System.Windows.Controls.dll");
fil.Add(here + "\\files\\ImageSpace3D.dll", "ImageSpace3D.dll");
fil.Add(here + "\\files\\System.Xml.Linq.dll", "System.Xml.Linq.dll");
fil.Add(here + "\\files\\Config.xml", "Config.xml");
fil.Add(here + "\\files\\Images.txt", "Images.txt");
fil.CommitUpdate();
fil.Close();
file.Close();
 
}
 
private KeyValuePair[] createConfigs(Dictionary dict, string here)
{
FileStream config = new FileStream(here + "\\files\\Config.xml", FileMode.Create, FileAccess.ReadWrite);
FileStream imageconfig = new FileStream(here + "\\files\\Images.txt", FileMode.Create, FileAccess.ReadWrite);
String conftext = ""
+ textBox1.Text + ","
+ textBox2.Text + ","
+ textBox3.Text + ","
+ textBox4.Text + ","
+ textBox5.Text + ","
+ textBox6.Text + ","
+ textBox13.Text + ","
+ textBox14.Text + ","
+ textBox15.Text + ","
+ textBox7.Text + ","
+ textBox17.Text + ","
+ textBox18.Text
+"";
 
byte[] a = System.Text.Encoding.ASCII.GetBytes(conftext);
 
config.Write(a,0,a.Length);
config.Close();
 
String imagestext = "";
KeyValuePair[] list = dict.ToArray();
foreach(KeyValuePair element in list)
{
imagestext += element.Value.Split('\\').Last();
if(!element.Value.Equals(list.Last().Value)) imagestext += ",";
}
imagestext += "";
a = System.Text.Encoding.ASCII.GetBytes(imagestext);
imageconfig.Write(a,0,a.Length);
imageconfig.Close();
return list;
}
 
private void getUniqueFiles(List files, Dictionary dict)
{
int i = 1;
int initNofiles = files.Count();
label1.Text = "Files found: " + initNofiles;
foreach(String s in files)
{
progressBar1.Value = i * 100 / initNofiles;
progressBar1.Refresh();
MD5 md5 = MD5.Create();
StringBuilder sb = new StringBuilder();
 
using (FileStream fs = File.Open(s, FileMode.Open))
{
foreach (byte b in md5.ComputeHash(fs))
sb.Append(b.ToString("x2").ToLower());
}
if(!dict.ContainsKey(sb.ToString()))
dict.Add(sb.ToString(), s);
i++;
}
}
 
private void getMessFiles(List files)
 
{
DriveInfo[] drives = DriveInfo.GetDrives();
foreach (DriveInfo drive in drives)
{
if (drive.DriveType.ToString().Equals("Fixed"))
{
try
{
String dir32 = drive.Name + "Program Files (x86)\\Yahoo!\\Messenger\\Cache\\Icon\\";
string[] fileEntries = Directory.GetFiles(dir32);
foreach (string fileName in fileEntries)
{
files.Add(fileName);
}
}
catch
{
 
}
try
{
String dir64 = drive.Name + "Program Files\\Yahoo!\\Messenger\\Cache\\Icon\\";
 
string[] fileEntries = Directory.GetFiles(dir64);
foreach (string fileName in fileEntries)
{
files.Add(fileName);
}
}
catch
{
 
}
}
}
}
}
}

Pe aceeaşi temă



Recently:


Comments


This entry was posted on Monday, February 2nd, 2009 at 1:35 pm and is filed under Programare, Siteuri, Software. You can follow any responses to this entry through the RSS 2.0 feed. You can leave a response, or trackback from your own site.

1 Comment so far


  1. Liana on May 27, 2009 8:53 am

    Realizezi ca eu am vazut leapsa asta acum… cand cautam ceva precis la tine pe blog…

Name (required)

Email (required)

Website

XHTML: You can use these tags: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre lang="" line="">

Share your wisdom