Connection Points i COM Bakgrunn Begrunnelse Bruk.

Slides:



Advertisements
Liknende presentasjoner
Repetisjon innkapsling static tabell av primitiv datatype LC191D Videregående programmering Høgskolen i Sør-Trøndelag, Avdeling for informatikk og e-læring.
Advertisements

Memento Object Behavioral Design Pattern. Lagre og hente tilstander • Et system inneholder ofte mekanismer som trenger gjenbruk av tilstander • Memento.
Everyone Print Kalle Snarheim.
Uke 10 - Sortering, og hvordan lage en klasse for et klassebibliotek 21 okt. 2003, Arne Maus Inst. for informatikk, UiO.
Gruppemedlemmer Gruppa består av: Magnus Strand Nekstad – s156159
NUUG.topic = Ruby.new Johannes Brodwall Takk til Dave Thomas for bruk av enkelte slides.
Ledelsesinformasjonsystem
Tjenestebasert design med dynamiske proxyer og Spring Bjørn Vidar Bøe, JavaZone 2005.
Web Client Software Factory Inge StubdalLevel 300 Avanade.
Beslektede algoritmer. Isolere klient fra algoritme  Klienter trenger av og til helt forskjellige måter å gjøre det samme på  Men klienten selv kan.
Programmering i Java versjon januar 2005 Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else.
Mer sortering Mer Debugging Introduksjon til strukturer.
Variasjoner i subklasser.  Prinsippskissen er meget enkel  En abstrakt klasse har en konkret metode og en abstrakt metode  Hver subklasse realiserer.
Teknisk. Oversikt •Forskjellen på vPos systemet fra 2004 til •Mest om vPos serveren. •Også noe om SilentWings Viewer.
IS-102 Klassedefinisjoner
Designing the User Interface (Antall brukere == Antall meninger)
Tema: Introduksjon Hvorfor Velocity? Installasjon Velocity VS. JSF / JSP Eksempler Oppsumering.
C# for javaprogrammerere
Nettverk Software Protocol Hierarchies
Filer Finne minste Finne Største Beregne gjennomsnitt Variabler Tabeller – Arrays Lage frekvenstabell.
Jæger: Robuste og sikre systemer INF150 Programmering torsdag 31.8 Kapittel 3: Grunnlag for programmering i Visual Basic.
Patterns (mønstre) Patterns er erfaringer Patterns er best-practices Patterns er how-to Patterns er velkjent design Larman: ” ’new Pattern’ is an Oxymoron”
Læring og tenkning Systemutvikling er læring Gjensidig respekt og samarbeid Følge en konkret oppskrift Velge blant flere oppskrifter Nå målet uten oppskrift,
Bendik Bygstad Høgskolen i Vestfold RUP-prosjekt Sammenhengen med UML 1.Hovedstruktur i RUP-prosjekter 2.Faser og iterasjoner 3.Sammenhengen med.
Combining Compound Conceptual User Interface Components with Modelling Patterns - a Promising Direction for Model-based Cross-platform User Interface Development.
DCOM - Distributed Component Object Model Hans Harald Wennersgård Jørn Anders Svendsen.
Kap 05 Abstrakte datastrukturer. Arv - Implementering Interface / Abstrakte klasser / Konkrete klasser Concrete classAbstract class Interface extends.
Versjon 1.0 / Kap 2: Applikasjonslaget1 Avsnitt 2.5 DNS Computer Networking: A Top Down Approach Featuring the Internet, 2 nd edition. Jim Kurose,
Design Patterns Iterator & Mediator. Gruppe 8 Presentasjonsgruppe:Resten av gruppen: Marianne AtesAndrè Johansen Tom Vidar LundeHege-Kristin Johansen.
Singleton & Adapter Pattern Gruppe 3. Singleton Pattern Sørger for at en klasse kun kan ha en instans Vanligvis implementert med globale variabler –Singleton.
1 Information search for the research protocol in IIC/IID Medical Library, 2013.
std::basic_string En oversikt over C++ Standard bibliotekets streng-klasse.
Copyright © 2003 Systek OOs gjenfødsel? Innlegg til Systek’s teknologisamling Johannes Brodwall.
Active Server Pages Dynamic content in Microsoft Internet Information Server 4.0+
Copyright © 2003 Systek J2EE Arkitektur Java Workshop CBA Johannes Brodwall, Systek as.
Tema: Test First Positivist: Det som ikke kan måles, eksisterer ikke! Reduserer sjanser for defekter! Gir en oppdatert ”TODO-liste” Gir trygghet til å.
Persistenslag i Fakir Teori og praksis. Bruk av persistenslag 4 Felles interface for alle record brokere: interface IDbRecordBroker : IDispatch { HRESULT.
Java & OO.
INF 295 Algoritmer og datastrukturer Forelesning 2 - kapittel 1 Hans F. Nordhaug (Ola Bø)
ADA 95 – del3 Foreleser: Olaf Hallan Graven Bok: Programming in ADA95 (2nd) John Barnes.
Høgskolen i Oslo Webprogrammering Ajax og PHP. I dag l Hvordan få en bedre brukeropplevelse via Ajax- script l Gjennomgang av kode l Oppgaveløsning på.
Høgskolen i Oslo Webprogrammering Java-scripting 2 Klientvalidering.
Triggere Mutasjoner i basen. Triggers Triggers are stored procedures that execute automatically when something (event) happens in the database: : data.
Instead-of-trigger Faglig forum. Instead-of-trigger Problem: En har et VIEW som består av mange JOINs. Komplekst å oppdatere alle tabellene som inngår.
JavaOne oppsumering tobias k torrissen
  Den perfekte julegaven til Javakoden din Johannes Brodwall Steria.
Innkapsling av request. Køing, logging, angre Command tilhører gruppen av ”behavioral patterns” Instanser av mønsteret leder til instanser av forespørsler.
PARLAY/OSA Referanser: Referanser Foredraget er i all hovedsak basert på to artikler. Disse kan finnes på:
OOT Seminar H-97 CORBA Praktisk del. Valg av ORB implementasjon n Har valgt å bruke Visigenic sin ORB implementsjon n ORB’en er 100% Java kodet n Bygger.
Løsningsforslag til MOFScript oppgave. Metamodellen.
Oppgaver til kodegenerering etc. INF-5110, 2013 Oppgave 1: Vi skal se på koden generert av TA-instruksjonene til høyre i figur 9.10 i det utdelte notatet,
02 - Java datatyper Grundlæggende om datatyper og variable.
1 Pointere, referencer, struct’s mv.. 2 Erklæringer Eksempel på erklæringer int i, *ip, f ( ), *fip( ), (*pfi) ( ); Erklærer en integer, en pointer til.
Fra Mitose til Happy-meal Innføring i “Prototype Patterns” og “Builder Patterns” Gruppe 2 Carl-Erik Herheim Leendert Wienhofen Olav Dæhli Thomas Julsen.
1 | 2010 Internetteknologi 2 (ITNET2) Kort teknisk ASP.NET introduktion Mandag den 4/ Jesper Tørresø.
Sensitive tema Hva gjør jeg hvis misnøye med utseendet ser ut til å være et problem for en deltaker eller kollega LIFELONG LEARNING PROGRAMME This project.
Tabeller Dette er en tabell, eller array. Den kan defineres sånn som dette: public int[] heltallsTabell = new int[11]; //Her er 11 tabellens lengde for.
Jæger: Robuste og sikre systemer INF150 Programmering Kapittel 2: Problemløsning Kapittel 3.1 og 3.2.
GPS simulator Et C# program som sender data fra en GPS fil til RS232 og simulerer en GPS engine. Tre linjer pr. sekund er satt opp.
Regresjonsanalyse Korrelasjon
Android-Programmering Våren Introduksjon ActionBar Behovet for forandring Hva er Android ActionBar Tilpasning av ActionBar ActionBar - versjonshåndtering.
Android-Programmering Våren Oversikt Ytelse vs responsivitet Strategier for og opprettholde responsiviteten Tråder Asynchronous Task.
Ekstra mange tips til Oblig 3! 12. mars 2007 Are Magnus Bruaset og Arild Waaler Inst. for informatikk, UiO.
INF1000 (Uke 14) Eksamen V06 Grunnkurs i programmering Institutt for Informatikk Universitet i Oslo Are Magnus Bruaset og Arild Waaler.
Objektorientert design
Kapittel 9 Polymorfi. 9.1 Sein binding Ofte er det perfekt match mellom typen til ein variabel og objektet han refererer til ChessPiece bishop;... bishop.
Kapittel 12 Samlingar Samlingar og datastrukturar Ei samling (collection) blir brukt til å oppbevare og handtere andre objekt ArrayList – klassen.
Iterator i Java boolean hasNext() E next() void remove()
Android-Programmering Våren Oversikt Ytelse vs responsivitet Strategier for og opprettholde responsiviteten Tråder Asynchronous Task.
IN3030 – Effektiv parallellprogrammering Uke 1 2. del, våren 2019
Utskrift av presentasjonen:

Connection Points i COM Bakgrunn Begrunnelse Bruk

Oversikt over foredrag 4 Observer pattern –Bruk –Begrunnelse –Variasjoner 4 Løsninger i COM –Advise sinks –Connection Points Begrunnelse + oversikt Bruk

Noen forutsetninger 4 Relativt god kjennskap til COM –IUnknown –IDispatch –Formål og bruk (løs kobling mellom klient og tjener, transpartent distribuering) –IEnumXXX interfaces

Bakgrunn - Observer 4 Observer er et av “Patterns” som er beskrevet i Gamma, et al “Design Patterns” [GOF] 4 Fra Design Patterns: –“Intent: Define a one-to-many dependency between objects so that when one object changes state, all its dependents are notified and updated automatically.” 4 Det vil si: Vi ønsker et design der noen objekter (Observers) ønsker å bli informert når “ting skjer” med et annet object (Subject)

Observer - 2 (Arkitektur) 4 Observer har følgende design oversikt i “Design Patterns”:

Observer - 3 (Bruk) 4 Sekvensdiagram:

Observer - 4 (Eksempler) 4 Forhold mellom brukergrensesnitt og “modell” –Gir mulighet for bruk flere klienter mot samme state uten unødvendig kommunikasjonsoverhead 4 Brukes i Microsoft’s “Document-View” arkitektur, og i den eldre (og bedre) “Controller- Model-View” arkitekturen. 4 Kan med fordel brukes i distribuerte systemer.

Observer - 5 Varianter 4 Flere Subjects, Observers, og Events. –Kan modifiseres med et “Subscription” object –Kan “flates ut” for bruk i f.eks. C. Dette minner endel om Windows’ “WindowProc” 4 Asynkron oppdatering –Egen(e) tråd(er) for å la Subject oppdatere Observers 4 Informasjon om state kan sendes med Update 4 Flere varianter til “Update” funksjonen

COM og Observer 4 Observer patternet egner seg godt for distribuert og/eller modulbasert bruk –Mulighet for asynkron oppdatering –Løs kobling (“coupling”) mellom klient og tjener

COM og Observers - Problemer 4 Hvordan kan en scripting klient/dynamisk klient finne ut Run Time hvilke “Observer” interfaces en “Subject” støtter 4 Hvordan vil COM’s identitetregler fungere med Detach? (Jeg vet ikke)

COM Observer 1: Advise Sink 4 Den enkleste måten å lage en form for toveis kommunikasjon mellom klient og tjener 4 Eksempel: [ uuid(…), object, pointer_default(unique) ] interface IAdviseSink : IUnknown { HRESULT StateIsChanged(IAdviseSource* pSource); }; [ uuid(…), object, pointer_default(unique) ] interface IAdviseSource : IUnknown { HRESULT Attach(IAdviceSink* pSink); HRESULT Detach(IAdviceSink* pSink); // … + metoder for å endre tilstanden til objektet }; [ uuid(…) ] coclass AdviseSource { [default] interface IAdviseSource; };

Advise Sink - Bruk 4 Lag en klasse som implementerer IAdviseSink 4 Kall Subject’s IAdviseSource::Subscribe 4 IAdviseSink::StateIsChanged vil bli kalt fra subject når nødvendig 4 Før klientens Advise Sink slettes, kall IAdviseSource::Unsubscribe class MyAdviseSink : public IAdviseSink { public: MyAdviseSink(IAdviseSource* pSource) : m_pSource(pSource) { m_pSource->Attach(this); } ~MyAdviseSink() { m_pSource->Detach(this); } STDMETHOD(StateIsChanged)(IAdviseSink*) { ::MessageBox(NULL, ”Server state has changed”, ””, MB_OK); } private: CComPtr m_pSource; }; JMB: Det kan hevdes at det ikke er så lurt å gjøre Attach og Detach i Constructoren og destructoren, ettersom disse funksjonene ikke er gode til å håntere feil situasjoner. JMB: Det kan hevdes at det ikke er så lurt å gjøre Attach og Detach i Constructoren og destructoren, ettersom disse funksjonene ikke er gode til å håntere feil situasjoner.

COM Observer 2: Connection Points (endelig!) 4 Formålet med å bruke Connection Points over Advise Sinks er hovedsaklig å gi støtte for Script klienter, og for å gi en dynamisk (run time) mulighet for å finne ut hvilke “observers” et objekt støtter. 4 Problemer som bør nevnes: –Mer komplisert enn Advise Sinks. –“Unødvendige” kall gir performance hit med distribuert klient/tjener.

Connection Points - Interfaces 4 IConnectionPointContainer 4 IEnumConnectionPoints 4 IConnectionPoint 4 IEnumConnections 4 I tilfellet med Advise Sinks er det vi som implementerer denne funksjonaliteten.

Connection points - Arkitektur

Connection Points - Arkitektur 2 4 En server kan ha flere connection points. 4 En klient kan implementere flere Sources.

IConnectionPointContainer [ object, uuid(…), pointer_default(unique) ] interface IConnectionPointContainer : IUnknown { HRESULT EnumConnectionPoints ( [out] IEnumConnectionPoints ** ppEnum ); HRESULT FindConnectionPoint ( [in] REFIID riid, [out] IConnectionPoint ** ppCP ); };

IEnumConnectionPoints [ object, uuid(...), pointer_default(unique) ] interface IEnumConnectionPoints : IUnknown { [local] HRESULT Next( [in] ULONG cConnections, [out, size_is(cConnections), length_is(*pcFetched)] IConnectionPoint** ppCP, [out] ULONG * pcFetched ); [call_as(Next)] HRESULT RemoteNext( [in] ULONG cConnections, [out, size_is(cConnections), length_is(*pcFetched)] IConnectionPoint** ppCP, [out] ULONG * pcFetched ); HRESULT Skip( [in] ULONG cConnections ); HRESULT Reset(); HRESULT Clone( [out] IEnumConnectionPoints ** ppEnum ); };

IConnectionPoint [ object, uuid(...), pointer_default(unique) ] interface IConnectionPoint : IUnknown { HRESULT GetConnectionInterface( [out] IID * pIID ); HRESULT GetConnectionPointContainer( [out] IConnectionPointContainer ** ppCPC ); HRESULT Advise( [in] IUnknown * pUnkSink, [out] DWORD * pdwCookie ); HRESULT Unadvise( [in] DWORD dwCookie ); HRESULT EnumConnections( [out] IEnumConnections ** ppEnum ); };

IEnumConnections [ object, uuid(…), pointer_default(unique) ] interface IEnumConnections : IUnknown { typedef struct tagCONNECTDATA { IUnknown * pUnk; DWORD dwCookie; } CONNECTDATA; [local]HRESULT Next( [in] ULONG cConnections, [out, size_is(cConnections), length_is(*pcFetched)] CONNECTDATA* rgcd, [out] ULONG * pcFetched ); [call_as(Next)] HRESULT RemoteNext( [in] ULONG cConnections, [out, size_is(cConnections), length_is(*pcFetched)] LPCONNECTDATA rgcd, [out] ULONG * pcFetched ); HRESULT Skip([in] ULONG cConnections); HRESULT Reset(); HRESULT Clone([out] IEnumConnections ** ppEnum); };

Connection Points - Eksempel [ uuid(…), object, dual, pointer_default(unique) ] interface IAdviseSink : IDispatch { HRESULT StateIsChanged(IAdviceSource* pSource); }; [ uuid(…), object, dual, pointer_default(unique) ] interface IAdviseSource : IDispatch { … }; [ uuid(…) ] coclass AdviseSource { [default] interface IAdviseSource; [default, source] interface IAdviseSink; interface IConnectionPointContainer; };

Connection points og Advise Sinks - Forskjeller 4 Både klient og tjener interface er Dispatch 4 IAdviseSource’s metoder for registrering og avregistrering er fjernet (Implementert i IConnectionPointContainer med venner)

Connection Points - C++ klient 4 Klient har implementert et objekt med IAdviseSink, og har en peker til en AdviseSource (coclass) DWORD Connect(IAdviseSource* pSource, IAdviseSink *pSink) { CComPtr pCPC; pSource->QueryInterface(__uuidof(IConnectionPointContainer), &pCPC); CComPtr pCP; pCPC->FindConnectionPoint(__uuidof(IAdviseSink), &pCP); DWORD dwCookie; pCP->Advice(pSink, &dwCookie); return dwCookie; }

Connection points - Vurderinger 1  Endel lenger enn AdviseSink tilfellet (ville være en linje: pSource->Subscribe(pSink); ) 4 QueryInterface, FindConnectionPoint og Advice fører alle til kall over nettverket. 4 I implementasjonen av Advice (eller hver gang IAdviseSource::StateIsChanged kalles), må serveren kalle QueryInterface for å få riktig interface (Advice tar en IUnknown* som argument)

Connection points - Vurderinger 2 4 IConnectionPointContainer og IConnectionPoint gir mulighet til å finne ut mer informasjon dynamisk, f.eks. hvilke Source interfaces som støttes (gjennom IConnectionPointContainer::EnumConnecti onPoints og IConnectionPoint::EnumConnections)

Connection Points Implementasjon - Server 4 Implementasjon av Connection Points på en server er relativt smertefritt med bruk av ATL. \VCMFC. CHM::/html/_atl_connection_points.htm) 4 ATL Wizard har støtte for connection points.

Connection Points Implementasjon - ATL class CoAdviseSource : public CComObjectRootEx, public CComCoClass, public IConnectionPointContainerImpl, public IConnectionPointImpl { public:... BEGIN_COM_MAP(CoAdviseSource) COM_INTERFACE_ENTRY_IMPL(IConnectionPointContainer) END_COM_MAP() BEGIN_CONNECTION_POINT_MAP(CoAdviseSource) CONNECTION_POINT_ENTRY(IID_IPropertyNotifySink) END_CONNECTION_POINT_MAP()... }; JMB: De uthevede linjene gjentas for hvert connection point som skal implementeres JMB: De uthevede linjene gjentas for hvert connection point som skal implementeres

Advise Sinks - Implementasjon class CoAdviseSource : public CComObjectRootEx, public CComCoClass { public:... BEGIN_COM_MAP(CoAdviseSource) COM_INTERFACE_ENTRY(IAdviseSource) END_COM_MAP() class CSourceImpl : public IAdviseSink { public: STDMETHOD(StateIsChanged)(IAdviseSource* pSource) { std::list ::iterator pSink = m_pSinkList.begin(); while ( pSink != m_pSinkList.end() ) (*pSink++)->StateIsChanged(pSource); return S_OK; } // … Implementasjon av Attach og Detach private: std::list m_pSinkList; } m_SourceImpl; STDMETHOD(Attach)(IAdviceSink* pSink); STDMETHOD(Detach)(IAdviceSink* pSink); }; JMB: Kaller inn til tilsvarende metode i CSourceImpl JMB: Kaller inn til tilsvarende metode i CSourceImpl

Advise Sink Implementasjon - sende event 4 IAdviseSink: { // … m_SourceImpl->StateIsChanged(this); }

Connection Points ATL Implementasjon - Sende event CComQIPtr pCPC(pUnk); if (!pCPC) return S_OK; CComPtr pCP; pCPC->FindConnectionPoint(IID_IAdviseSink, &pCP); if (!pCP) return S_OK; CComPtr pEnum; if (FAILED(pCP->EnumConnections(&pEnum))) return S_OK; CONNECTDATA cd; while (pEnum->Next(1, &cd, NULL) == S_OK) { if (cd.pUnk) { HRESULT hr = S_OK; CComQIPtr pSink(cd.pUnk); if (pSink) hr = pSink->StateIsChanged(dispID); cd.pUnk->Release(); if (hr == S_FALSE) return S_FALSE; } return S_OK; JMB: Denne koden er hentet fra CFirePropNotifyEvent::FireOnRequestEdit og redigert til vårt formål JMB: Denne koden er hentet fra CFirePropNotifyEvent::FireOnRequestEdit og redigert til vårt formål JMB: Koden er komplisert, ettersom den ønsker at serveren skal bruke klientens rammeverk. Det er mulig at det allerede finnes enklere måter å gjøre dette på. JMB: Koden er komplisert, ettersom den ønsker at serveren skal bruke klientens rammeverk. Det er mulig at det allerede finnes enklere måter å gjøre dette på.

Betraktninger 4 ATL gir endel kode gratis, men gir også endel kompleksitet (tidliger diskusjon) 4 Det er imidlertid mulig å ha både en ConnectionPoint og en AdviseSink implementasjon av Observer, nemlig: STDMETHODIMP(CoAdviseSource::Attach)(IAdviseSink* pSink, DWORD* pdwCookie) { typedef IConnectionPointImpl IAdviseSource; return ((IAdviseSource*)this)->Advise(pSink, pdwCookie); } JMB: Signaturen til Attach er modifisert med en Cookie for å ha en enklere mapping til connection points. JMB: Signaturen til Attach er modifisert med en Cookie for å ha en enklere mapping til connection points.

Noen merknader 4 Connection points vil antageligvis gjennomgå en større endring til COM+. For det meste gjennom endringer i C++ språket i VC++ (versjon 7?) 4 Advise Sinks går ann å bruke fra VB, men det krever mer arbeid enn Connection points. 4 Connection points er eneste muligheten fra script klienter. 4 Connection points og Advise Sinks er kompatible, i det minste dersom man lager sin egen implementasjon.

Oppsummering 4 Formålet med connection points er å åpne for to-veis kommunikasjon mellom klient og tjener i COM. 4 Den som implementerer tjeneren bestemmer Connection Point (Observer, Advise Sink) interfacet. 4 Connection points er en noe klønete og ineffektiv implementasjon av Observer Patternet i [GOF]. 4 Dersom man skal støtte script-klienter må man bruke Connection Points, eller er man fri til å bruke en egen løsning, som Advise Sinks. 4 ATL har en standard implementasjon av Connection Points. Den er imidlertid ikke helt perfekt.