#acl TahitiAdminGroup:read,write All:read #pragma title Tahiti 4.x, protokol - Type 0 #pragma title-link ProtocolCZ Jedná se o základní typ umožňující přenos jednoho XML souboru. Ten je určen pro přenos dotazu, resp. odpovědi na dotaz. Formát souboru musí odpovídat standardu XML-RPC (viz. http://www.xmlrpc.com/spec ). Tento typ rámce slouží pro vzdálená volání. Následující popis dostupných metod je zapsán pomocí „pseudo C“ syntaxe. Součástí každého volání je položka ticker, která slouží k jednoznačné identifikaci volání. Tato položka je vrácena současně s návratovou hodnotou funkce. == Autorizace == Prvním krokem po vytvoření spojení je autorizace klienta. Ta se provede zavoláním metody authorize. {{{int authorize(string ticker, string user, string password);}}} Parametrem metody jsou: || user || uživatelské jméno || || password || heslo pro přihlášení || Příklad převedeného volání do XML-RPC: {{{ authorize ticker user password }}} Jako odpověď je očekáváno číslo: || 0 || korektní přihlášení || || 1 || chybné jméno nebo heslo || || 2 || jiná chyba při přihlášení || == Vzor odpovědi == Formát odpovědi odpovídá standardní odpovědi pro XML-RPC. Navíc vždy jako první parametr obsahuje ticker, který je shodný jako při volání. {{{ ticker 130 }}} == Popis dokumentu a jeho příjem == Dokument je popsán strukturou Document. {{{ /* Document description */ Struct Document { /* Unique document identifacator */ string documentId; /* Document version. Every document * can have more versions. */ string version; /* Document version. This is identification * of subversion on server side. Client can * safely ignore this value and have to just * send it back to server. */ string serverVersion; /* Document type. Document type define which * attributes are valid for document, how-to * display document and organize in logical * structure. Every document have to have * valid type. */ string type; /* Document modification. * 0 – document is not modified * 1 – document attributes are modified */ int modified; /* Document attributes. Array of document * attributes. Used attributes depens on document type */ array attributes { /* Structure describes one attribute */ struct Attribute { /* Attribute name */ string name; /* Attribute value */ string value; }; }; /* Array of files, pages. */ array files { /* Structure describing one file, page */ struct File { /* Unique file (page) identifacator */ string ident; /* File mime-type. */ string mimeType; /* Page importance. * 0 – page is not important * 1 – page is important */ int important; /* Page modification. * 0 – page is not modified * 1 – page attributes are modified * 2 – page data modified * 3 – page attributes and data modified */ int modified; /* Page number */ int pageNumber; /* Page notes or comments. */ string note; /* Original filename. */ string origName; /* Keys for page decryption/encryption. */ string keys; /* Page signature. */ string signature; }; }; }; }}} Dokument ze serveru na klienta je možno zaslat metodou pushDocument. Metoda zajistí přeposlání dokumentu, resp. popisu jeho struktury {{{Document}}}. Metoda nemá žádnou návratovou hodnotu. Při příjmu dokumentu klient reaguje na nastavení hodnot {{{modified}}}. {{{void pushDocument(string ticker, Document document, int state);}}} Parametr state určuje, zda je možno dokument odeslat zpět, zde je určen pouze k prohlížení či je možno mazat stránky (0 – dokument pouze pro čtení, 1 – dokument pro čtení a zápis). == Vyžádání souboru == Vyžádání souboru ze serveru se provede metodou {{{requestFile}}}. Metoda zajistí odeslání jedné stránky do klienta. Soubor je odesílán jako rámec typu 1. {{{void requestFile(string ticker, string fileId);}}} Parametr {{{fileId}}} je jednoznačný identifikátor souboru. == Vyžádání dokumentu == Klient může zaslat žádost o dokument pomocí metody getDocument. {{{GetDocumentResponse getDocument(string ticker, string docId, string version, int state);}}} || Parametr || Význam || || docId || jednoznačný identifikátor dokumentu || || version || identifikace verze, pokud je řetězec prázdný je zaslána poslední verze || || state || způsob vyžádání (0 - pouze pro čtení, 1 - čtení i zápis) || Metoda jako odpoved strukturu GetDocumentResponse. {{{ struct GetDocumentResponse { string ticker; int retCode; string version; } }}} Parametr retCode obsahuje 0 v případě platné žádosti. V případě chyby, neplatná žádost nebo nedostupnosti dokumentu je vrácena hodnota >0. Parametr version obsahuje verzi dokumentu, ktery bude vracen ( slouzi ke sparovani vraceneho dokumentu, pokud byla vyzadana posledni verze a ne konkretni cislo verze). Vyžádaný dokument je zaslán zpět pomocí metody pushDocument. == Vyžádání konfigurace == Vyžádání konfiguračního souboru ze serveru se provede metodou requestConfig. Metoda zajistí odeslání požadovaného souboru do klienta. Soubor je odesílán jako rámec typu 2. {{{void requestConfig(string ticker, string fileId);}}} || Parametr || Význam || || fileId || jednoznačný identifikátor souboru || V případě chyby vyžádání souboru, tj. soubor je neplatný, neexistuje apod. může server vyslat oznámení o chybě. {{{void errorRequestConfig(string ticker, string fileId, int errorCode);}}} || Parametr || Význam || || fileId || identifikátor souboru, který není možno vrátit || || errorCode || identifikace chyby ke které došlo || == Uložení dokumentu == Uložení dokumentu se skládá ze tří kroků. Prvním je vytvoření nové verze na straně serveru, alokace identifikátorů pro ukládané soubory, druhým uložení vlastních datových souborů a třetím potvrzení úspěšného přijetí celého dokumentu. {{{ /* Structure with newly allocated * identificators, new version */ Struct SaveDocument { /* Document state: * 0 – ok, 1 – lock, 2 – document not up2date, 3 – error */ int state; /* Document identifacator. This is unique * document identifacator. If new document * is saved server have to generate this identificator. */ string documentId; /* Identificator of new document version. * Each document version have to unique combination of * docId and version. */ string version; /* Identificator of new server version. * Server version is used by optimistic server locks. */ string serverVersion; /* List of new identificators for files. */ array NewFileIdents; }; }}} Funkce pro uložení dokumentu nebo jeho nové verze: {{{SaveDocument saveDocument(string ticker, Document document);}}} Parametrem funkce je struktura {{{Document}}}. Musí mít korektně vyplněny všechny položky. Výjimku tvoří identifikátory ukládaných souborů. V případě, kdy soubor není modifikován, tj. nebude odesílán na server, tak je vyplněn současný identifikátor, u změněného nebo nového souboru se identifikátor nevyplňuje a je to prázdný řetězec. Funkce vrací zpět identifikátory všech ukládaných souborů. Při ukládání nového dokumentu na server je identifikátor dokumentu i jeho verze prázdný řetězec. Server vrací zpět nově vytvořený identifikátor dokumentu a jeho verzi. === Chování serveru při ukládání souborů === 1. Jestliže je vyžádán dokument v průběhu ukládání, tak se vrací poslední platně uložená verze. 2. Jestliže se klient pokouší uložit dokument paralelně s jiným je vrácena informace o uplatněném zámku. Zámek se odemkne při uložení všech souborů, pádu spojení nebo vypršení časového limitu. Po úspěšném přijetí celého dokumentu je poslána notifikace zpět na klienta, tj. zavolána funkce: {{{void receivedDocument(string ticker, string documentId, string documentVersion);}}} Funkce nemá žádnou návratovou hodnotu a slouží pouze pro notifikaci klienta. V případě chyby při ukládání dokumentu je možno klienta notifikovat o této situaci pomocí {{{errorReceivedDocument}}}: {{{void errorReceivedDocument(string ticker, string documentId, string documentVersion, int reason);}}} Funkce nemá žádnou návratovou hodnotu a slouží pouze pro notifikaci klienta. Význam proměnné reason (důvod chyby): || 1 || lock || || 2 || document not up2date || || 3 || error || == Příjem objektu == Protokol umožňuje přenos obecných objektů. Přenášený typ objektu je určen položkou type. Další hodnoty definované pro daný typ objektu jsou popsány dvojicí název/hodnota. Následující struktura popisuje jeden přenášený objekt. {{{ /* Object description / Struct Object { /* Object type */ string type; /* Array of object attributes */ array attributes { /* One attribute */ struct Attribute { /* Attribute name */ string name; /* Attribute value */ string value; }; }; }; }}} Objekt je přenesen pomocí metody {{{pushObject}}}. {{{void pushObject(ticker, Object);}}} Metoda zajistí přeposlání objektu, resp. jeho struktury. Metoda nemá žádnou návratovou hodnotu. == Seznam úkolů == Seznam úkolů na straně serveru je možno získat metodou {{{requestTaskList}}} {{{void requestTaskList(string ticker, array tasks);}}} Parametr {{{tasks}}} je seznam ůkolů, které má již žadatel k dispozici. Server může zaslat seznam úkolů klientovi pomocí metody {{{pushTaskList}}}. {{{void pushTaskList(string ticker, array tasks, int flag);}}} Parametr {{{tasks}}} je seznam úkolů. Význam proměnné flag je: || 1 || Úplný seznam - nahrazuje současný na klientovi - odpověď na volání {{{requestTaskList}}} || || 2 || Doplnění seznamu - úkoly v seznamu by měly být přidány k již aktuálně vyžádaným || Celkový počet vrácených úkolů (dostupných na klientovi) může být nastaven jako limit na serveru. Úkoly, které klient odeslal v seznamu svých úkolů a nejsou obsaženy ve vráceném seznamu jsou považovány za neplatné a klient je uvolní z UI. == Vyžádání úkolu == Konkrétní úkol je možno vyžádat metodou {{{requestTask}}}. {{{void requestTask(string ticker, string taskId);}}} Metoda pošle požadavek na vyžádání úkolu. Způsob zaslání úkolu závisí na serveru, obvykle voláním metody {{{pushDocument}}}. V případě chyby vyžádání úkolu musí server notifikovat klienta o této skutečnosti. {{{void errorRequestTask(string ticker, string taskId);}}} == Stav připojení == Po provedení autorizace nemohou přicházet nevyžádané dokumenty na klienta, tj. nelze posílat dokumenty pomocí pushDocument. Změnit stav připojení je možno pomocí metody {{{setState:}}} {{{void setState(string ticker, int iNewState);}}} Povolené stavy připojení: || 0 || výchozí stav neumožňující příjem dokumentů metodou pushDocument || || 1 || příjem dokumentů pomocí pushDocument je možný || == Odpojení == Před odpojením jedné ze stran je možno tuto skutečnost signalizovat protistraně voláním metody {{{disconnect}}}. {{{void disconnect(int iReason, string description);}}} Důvod odpojení je uveden v proměnné {{{iReason}}}. Důvody odpojení: || 0 || timeout || || 1 || ukonceni aplikace || || 2 || jiný důvod, popis je uveden v proměnné description ||