2007-02-12

En dum klient, en ännu dummare server

SymbianOS är ett sådant där system som bygger på en mikrokärna. Precis som i andra sådana system så finns en massa funktionalitet i servrar, som man kommunicerar med genom att skicka meddelanden till. Vill man öppna en fil så skickar man ett meddelande till filservern. Vill man rita något i ett fönster så skickar man ett meddelande till fönsterservern. Vill man ha tag på sprit så skickar man ett meddelande till spritservern. Man behöver i och för sig inte ta hand om de här detaljerna i vanliga fall, utan man går igenom ett klientlib som sköter själva meddelandeskickandet.

Ska man implementera egna servrar, vilket man är tvungen att göra ganska ofta, så är man dock tvungen att gå i närkamp med klient/server-ramverket. Man skulle kunna föreställa sig att ett OS som är så baserat kring klient/server-kommunikation skulle ha väldesignade mekanismer för detta, men det är trots allt Symbian vi snackar om här. Jag tänkte att vi skulle ta en liten titt på det knarkrus som är serversidans gränssnitt mot inkomna meddelanden, en klass om i SymbianOS 9 heter RMessage2.

Ett meddelande kan innehålla max fyra argument. Dessa plockar man ut med metoderna Int0(), ..., Int3(), om de är numeriska, eller Ptr0(), ..., Ptr3() om de består av strängar. Det finns ingen form av typkontroll, så både klienten och servern måste ha koll på vilka typer det är som gäller för de olika argumenten. Lustigt nog finns det inga uppgifter om hur många argument klienten har valt att skicka med i RMessage2. Det finns alltså inget sätt att kolla om klienten har gjort ett korrekt anrop eller ej. Jag skulle tro att anledningen till den här designen är antingen att man ville spara utrymme (det skulle faktiskt ta hela 2 bitar för att representera antalet argument) eller för att det inte var tänkt som ett öppet system från början. I en situation där man jobbar flera stycken tillsammans på ett projekt kan det här vara ganska irriterande. Säg att någon lägger till ett nytt argument till en funktion på servern. Det finns ingen som helst kontroll på att klienten skickar vettiga argument, så buggarna som uppstår är jobbiga att fixa. Det här skulle vara okej om det fanns något sätt att generera stubbar för att skicka och ta argument, men så roligt ska vi inte ha. Det här är SymbianOS, så vi marshallar våra argument själva.

Jag tänkte peka på en sak till i RMessage2 som jag finner ganska roande och säger en hel del om hur det går till när man designar API:er på Symbian. I SymbianOS 9 finns det ett capability-baserat säkerhetssystem, d.v.s. en applikation har rättighet att göra olika saker, baserat på vilka capabilities den har. En server måste alltså kunna kolla vilka capabilities en klient som gör ett anrop har, så att den kan avgöra om den har rätt att be om en tjänst. I RMessage2 använder man HasCapability() (eller HasCapabilityL()) för att kolla capabilities. Notera dock att det finns två överlagrade versioner av varje anrop. Med den ena kollar man om klienten har en viss capability. Med den andra kan man kolla två capabilities samtidigt. Varför någon skulle vilja ha den andra versionen är en gåta för mig. Och om man nu kan vilja kolla två capabilites, varför inte tre? Tja, i så fall får man göra flera anrop. Och jobbar man på Symbian så får man uppenbarligen gratis crack till morgonkaffet. Gött.

7 kommentarer:

ul7 sa...

Det var Ptr1, Ptr2, Ptr3 och Ptr4 på en öde ö. Det var dock ett folk som bodde där. De sa till Ptr1 och de andra, “Hitta en frukt eller en grönsak som vi inte känner till. Om vi känner till den så kör vi upp den i röven på er.” Först gick Ptr2 och hämtade en morot. De körde genast upp den i röven på honom. Sen gick Ptr3 och hämtade ett päron och det körde de upp i röven på honom. Till en början sa han “ahh, oh” av smärtorna, sen började han att skratta. Folket där undrade vad som var så roligt. Då sa han: “Kolla Ptr1 kommer med en vattenmelon”.

hjon sa...

Och Ptr4() kom tillbaka från skogen och sa: "Visste ni att det fanns en lucka där inne, som verkar leda ner i jorden? Den har inget handtag på utsidan." Folket där svarade: "Linné var här på 1700-talet och klassificerade den som en frukt. Nu måste vi gräva upp en stor underjordisk forskningsstation. Jättekul. Tack så mycket!"

puterman sa...

Men då kom Linné springande och viftade med armarna som en dåre. "Stopp för i helvete, så här får det inte gå till! Efter hjons inlägg fattar jag inte om det var en frukt eller en lucka jag upptäckte, så det finns inte en möjlighet att jag ska kunna kategorisera den." hjon klev rodnande åt sidan, Ptr3() viftade förföriskt med ögonbrynen och Int0() låtsades snubbla.

Anonym sa...

alltså blir lite trött på att jag måste påpeka fakta hela tiden. du verkar inte fatta riktigt. så här är det: i exempel mobil telefoner har man väldigt lite minne då måste man spara så mycket man kan och inte lägga in lyx funktioner med argument hur många argument man har osv. tror du verkligen mobil spelen eller programmen hade kommit nån vart om det hade varit fin fina abstraktioner? näe tänkte väl det.

sedan har du tänkt på att det faktiskt är experter som gör symmbian. du kanske tror du vet bättre än dig men jag ska överraska dig det är de som vet hur man programmerar. mvh leif

puterman sa...

leif: Jag vet bättre än mig.

ul7 sa...

Puterman: Bevisa det!

puterman sa...

Linné låter hälsa att jag inte behöver bevisa saker som är uppenbart sanna.