David Bednárek Jakub Yaghob Filip Zavoral http://data.ksi.ms.mff.cuni.cz/svn/nprg051pub/html/nprg051.html
XML SAX, DOM, XmlReader libxml+libxslt xerces, xalan, altova,... Nemá nahradit přednášku o XML NPRG036 Technologie XML Použití konfigurace a sejvy export / import serializace konverze dat...... jsem si vytvořil vlastní formát na ukládání konfigurace
Sekvenční - SAX Rychlé, paměťově nenáročné Jeden lineární průchod Události - callback Stromová reprezentace - DOM Celý dokument je načten v paměti Opakovaný průchod, paměťově náročné Push vs. pull parser - XmlReader Proud událostí vs. čtení na vyžádání
SAX = Simple API for XML Sekvenční průchod Čtení části dokumentu = událost callback - obsluha
class Parser {... ; parse_xml(const char *fn) { Parser my_state; xmlsaxhandler saxhandler; memset( &saxhandler, 0, sizeof(saxhandler) ); saxhandler.initialized = XML_SAX2_MAGIC; saxhandler.characters = &Parse::characters; saxhandler.startelementns = &Parse::startElementNs; saxhandler.endelementns = &Parse::endElementNs; saxhandler.warning = &Parse::warning; saxhandler.error = &Parse::error; if( xmlsaxuserparsefile(&saxhandler, &my_state, fn) < 0) { return -1; else return my_state.return_val; vlastní třída - callbacks - stav struktura s nadefinovanými handlery parsování celého souboru postupně obvolávané funkce
class Parser { private: whatever state; public: void startelementns( const string& name) { if( state...)... static void startelementns( void * ctx, const xmlchar * localname, const xmlchar * prefix, const xmlchar * URI, int nb_namespaces, const xmlchar ** namespaces, int nb_attributes, int nb_defaulted, const xmlchar ** attributes ) { Parser &p = *( static_cast<parser *>( ctx)); p.startelementns( string( localname)); metoda objekt - stav callback - funkce statická metoda static void error( void * ctx, const char * msg,...) { Parser &p = *( static_cast<parse *>( ctx ) ); va_list args; va_start(args, msg); vprintf( msg, args ); va_end(args);
void print_element_names(xmlnode* a_node) { xmlnode *cur_node = NULL; for(cur_node=a_node; cur_node; cur_node=cur_node->next) { if (cur_node->type == XML_ELEMENT_NODE) printf("name: %s\n", cur_node->name); print_element_names(cur_node->children); void parse { xmldoc *doc = NULL; xmlnode *root_element = NULL; doc = xmlreadfile(fn, NULL, 0); if (doc == NULL) printf("error: %s\n", argv[1]); root_element = xmldocgetrootelement(doc); print_element_names(root_element); xmlfreedoc(doc); xmlcleanupparser(); 2. navigace v interních strukturách 1. načtení celého stromu
void processnode(xmltextreaderptr reader) { const xmlchar *name, *value; xmlnodetype type; type = xmltextreadernodetype(reader) name = xmltextreaderconstname(reader); value = xmltextreaderconstvalue(reader);... void streamfile(const char *fn) { xmltextreaderptr reader; int ret; reader = xmlreaderforfile(fn, NULL, 0); if( reader == NULL) return -1; while((ret=xmltextreaderread(reader))==1) { processnode(reader); xmlfreetextreader(reader); return ret; aktivní čtení - pull řízeno klientem, ne parserem
SAX Rychlé, paměťově nenáročné Jeden lineární průchod Nepříliš pohodlné programování DOM Plná navigace v dokumentu Celý dokument je načten v paměti Paměťově náročné XmlReader Čtení na vyžádání Ruční zpracování / datové struktury Není podporováno všemi parsery
kritika XML příliš ukecané nevhodné tam, kde je třeba šetřit - přenos po síti, mobily,... JSON { "firstname": "John", struktura podobná XML "lastname" : "Smith", výrazně úspornější "age" : 25, "address" : { vychází z JavaScriptu "Address": "21 X Street", "city" : "New York" libjson... a mnoho dalších Binary XML několik formátů neexistuje de-facto standard BiM - ISO Standard (MPEG working group) BXML - open binary encoding format for XML Efficient XML - basis for the W3C Standard for Binary XML...
HANDLE f = CreateFile("f.txt", FILE_READ_DATA, FILE_SHARE_READ, 0, OPEN_EXISTING, FILE_FLAG_RANDOM_ACCESS FILE_FLAG_OVERLAPPED, 0); OVERLAPPED o; memset(&o, 0, sizeof(overlapped)); o.hevent = CreateEvent(0, TRUE, FALSE, 0); o.offset = offs; ReadFile(f, buf, sz, &rsz, &o); nejaky_uzitecny_kod WaitForSingleObject(o.hEvent, INFINITE); CloseHandle(o.hEvent); CloseHandle(f);
int f = open("f.txt", O_RDONLY O_LARGEFILE, rights); aiocb a; memset(&a, 0, sizeof(aiocb)); a.aio_fildes = f; a.aio_offset = offs; a.aio_nbytes = sz; a.aio_buf = buf; a.aio_sigevent.sigev_notify = SIGEV_NONE; aio_read(&a); nejaky_uzitecny_kod if( aio_error( &a)!= EINPROGRESS) yyy // finished aio_suspend(&a, 1, 0); rsz = aio_return(&a); close(f);
win win api / mfc / win forms / WPF linux / unix X-Windows / multiplatform multiplatform Qt, gtk, wxwidgets,... Nemá nahradit přednášku Programování pro... NSWI079 Programování pro X Window System NSWI036 Programování pro Windows I NSWI037 Programování pro Windows II NSWI038 Praktikum programování pro Windows
Win API MFC
základní rozhraní pro Win, nejen GUI 'objektové' C relativně low-level proč? efektivní malý prográmek 'Jak mám udělat tohle?...žádná komponenta na to není' g_hwndbutton1 = CreateWindowEx(0, TEXT("BUTTON"), TEXT("Tlac"), WS_CHILD WS_VISIBLE BS_PUSHBUTTON, 10, 50, 75, 25, g_hwndmain, (HMENU)NULL, g_hinstance, NULL); if ( g_hwndbutton1 == NULL ) return FALSE; g_hwndend = CreateWindowEx(0, TEXT("BUTTON"), TEXT("Konec"), WS_CHILD WS_VISIBLE BS_PUSHBUTTON, 95, 50, 75, 25, g_hwndmain, (HMENU)ID_END, g_hinstance, NULL); if ( g_hwndend == NULL ) return FALSE;
MS Foundation Class objektová nadstavba nad Win API C++ knihovny integrováno s VS - wizards void CMfcView::OnMouseMove(UINT nflags, CPoint point) { // TODO: Add your message handler code here and/or call default CMfcDoc* pdoc = GetDocument(); if (blbdown) { LINE line( ptprev, point); pdoc->cary.add(line); pdoc->setmodifiedflag(true); UpdateStatusBar(); CView::OnMouseMove(nFlags, point); void CMfcView::OnEditUndo() { // TODO: Add your command handler code here CMfcDoc* pdoc = GetDocument(); pdoc->cary.removeat(pdoc->cary.getsize()-1); Invalidate(); pdoc->setmodifiedflag(true); UpdateStatusBar();
.Net 2.0 Interoperabilita C#, VB,... C++/CLI Click'n'Go On the File menu, click New, and then click Project. To add controls to a form - click Toolbox on the View menu. - place three controls from the Toolbox on the Form1: - drag a Label control to near... To write code to handle events - double-click on the button to add a button click event handler - an empty event handler method is generated for you - press Enter after the opening brace of the button1_click - type the code to run when that event occurs: Application::Exit();
Windows Presentation Foundation jiné (modernější) API.Net 3.0+ různé druhy médií tlusté ribbony skiny,... XAML extensible Application Markup Language <Button Content="Click Me" Click="OnButtonClick"> <Button.Background> <LinearGradientBrush> <GradientStop Color="Yellow" Offset="0" /> <GradientStop Color="Green" Offset="1" /> </LinearGradientBrush> </Button.Background> </Button>
GTK+ Trolltech/Nokia Qt wxwidgets často nejen GUI ale kompletní knihovny (qtstring) 'Multiplatform GUI Libraries Are A Dead End' VLC player, Google Earth 'multi-' platformní aplikace Skype.Lx, KOffice, KDE #include "wx/wx.h" #include "HelloWorldApp.h" IMPLEMENT_APP(HelloWorldApp) #ifndef INCLUDED_HELLOWORLDAPP_H #define INCLUDED_HELLOWORLDAPP_H class HelloWorldApp : public wxapp { public: virtual bool OnInit(); ; DECLARE_APP(HelloWorldApp) #endif // INCLUDED_HELLOWORLDAPP_H bool HelloWorldApp::OnInit() { wxframe *frame = new wxframe((wxframe*) NULL, -1, _T("Hello World")); frame->createstatusbar(); frame->setstatustext(_t("hello World")); frame->show(true); SetTopWindow(frame); return true;