 Lillqvist olen, kui libra ofis ja kollabora ofis olen, kui on app on iOS. Olen kontraktaeril ja kollaborabaktivitee. Pärast kõik kõik kõik kõik kõik kõik kõik. ja ettele sest kõik kõik läheb arv on olnud. Põhla, libraa suurid, ettele palju, ja tehtetel sest mobib operaatiskusistel, ilgud sest kõik põhla võist, ja või väga palju ja värsteinud on tehtelt, pärast 2011, ja palju, ettele, ettele, was taggedet for aber iiss Androida and also cross covering the windows was tried. Initialiteis vast jast maastli samté endüüd teened amma spare time and there weren't really any concrete plans on to get some actual product out of it and cross compilation effort for windows was supose to make it easier We had to build Librofis for windows, but there were all kinds of problems with that, and eventually we didn't continue that default anymore. Then back in 2014, there was this company called cloud on. If you remember them, they had an app for iOS, that included some file sharing or whatever. ja neid oli nüüd, nüüd ta ei põhuid, juhu või tehtu tõhkata, ja ta täitsa teda üle tõppel, ja ta tõtel tõhkada jõnne, ma saab, et ta ei hüüvinega, ja seda kahtutas põhüvida, ja ta tehtu, ja ta tehtu, ta ei kõik jõu, ja tõv, ta saab, ja ta ta tehtu, ja ta ta tehtu, ja ta tehtu, ja ta tehtu, igaasiele pretendedeliemptu, kui on kliand, kui kõik on nagu ka pirma? Librofiist ei ole kui tegagi tegavadel see ja tegavad ka speelminu tega. Piksimusse. Lekasse, kui on saada peale, ma käud saab näid ülle, kui tegavad tege. IOS oli saab teda, et ta saab onnud juba kaidab, et ta saab teda, et ta saab teda, et ta saab teda, et ta saab teda, et ta saab teda, ta selle jahani, ja ta saab teda, ta saab teda, aga ei ole kõik kõik püüda. Lähdegu järg, meil oli kõik püüda, kui Michael oli tähtu ideja kõik püüda libraofiis online javaskript, üusel interface ja üle mobioläpp. Tule, et see on see, kui on järg kõik püüda ja ei ole kui on põhvõl, et siin põhvõl kõik üle. Tegi ei ole põhvõl, kui on üle. Tegi Nikolas. See on kõik kõik läks, librafiiskod, võib kõik läheb, et meie on kõik kõik läheb, võib on kõik läheb, et meie on kõik läheb, ja meie on kõik läheb, et meie on kõik läheb. Ja per konele põhli platformu makoosi, ilm, linuks, androida. Me ei oleks minu tõlakulis, kui et et ei oleks põhli põhli põhli põhli põhli põhli põhli põhli kode. Kui on kuskompiitnud seda, et on ios ja android, siis ei see olem nii dinamikliibri, kui on see tehti, põhvõi tehti, ma on seda läheb rõhmast. Meie näevaas kui on põhvõi, et on ios, et ei see olem läheb rõhmast. Ma peab, et see on see, et see on põhvõi, Tõh, et kui on kõige tõmme, ma tehaad seda tõh. Tõh, et on Android, et kui on kõige tõmme, on kõige tõmme, et kui on tõmme, või kõige tõmme, saab kõige kõige kõige rastriksioon ja see on kõige tõmme, et kui on see tõmme, tõmme liibu, et kui on tõmme. wants to load. And when cross compiling we don't do any unit testing, which of course is a bit sad, but it isn't really possible to do it. Instead what could be done is to make an app that includes source code from unit tests and when you run that app it performs the unit testing. And we actually have once very small such app already ... on teotele. The core repository doesn't contain any app source code at the moment. There's 300 libra fish like still, but it's not built normally. Libra fish kit is mostly see like API... ... that is supposed to be very simple to use. See oli seda päris, et see oli üli, et siis kõik ei ole seda, et ta kui on üle, kesись, et ta kõik ei ole põlmõte, et ka on läheb, ta on üle, et ta on üle, et ta on üle, et ta on üle, et ta on üle, ta on üle, et ta on üle, et ta on üle, et ta on üle, et ta on üle. Näbi taad, kui todoendal ideega jäädu, jahad leibrofiskit udid. Librofist onnest. Kui seau ja või, et sinu sit on servea, on see maastur või või. WSD, web soket, Daemon. ja see on kõige proosise ja see on kõige dokumenta, et see on editeed, et see on kõige proosise. Ja kõige nüüd on librau kõige. Ja see on kõige proosise, et see on librau kõige proosise. Ja see on kõige proosise, et see on kõige kõige, see on see edge rude so that you can't even accidentally see on sea information from somebody else's documents ...and so on... And then the client in the browser uses lots of JavaScript and the communication between these. The client on the server uses that all browsers implement, that allows you to send messages from the client to the server and get replaced back. And also because it was easy to do it, like to use that for the inter-process communication, it is used also for between these processes. nüüd jälle, jahud vajalid, visate üh° vealide jõuspusti mõhme jõu teega ma teahub jääb mõhme üh° üh° seda jalne seda ja teahub selle jõuspusti mõhme et jõuspusti seda ma teahub mõhme teahub jõuspusti mõhme mõhme jõuspusti javaskripid. Platforms spesifik koodi ei ole kõige, mängu 1000 läheb, ja serva koodi C++, ei ole kõige läheb, päris päris päris päris päris päris päris spaghetti in there to filter out only those bits that are actually needed in the app. But it's not too bad. And these javascript parts then they run in a WebKit WebView. I think Android also has WebKit, yes. So it should be mostly compatible with both iOS and Android. On iOS these WebView things actually running separate processes, but that is not really that visible in the API. And then when this C++ code needs to communicate with the javascript code, if you compare to the online case there, there the server sends these WebSocket messages and the javascript receives them and replies also with WebSocket messages. In the app case they go through this native code layer that when the native code needs to do something or send something to the javascript parts, it asks the WebView to execute one line of javascript code typically. That then invokes a function. And from there on it continues as if it would have received it WebSocket message. And what in the online server where you have these separate processes that send messages to each other in the app, they run mostly as different threads and instead of sending any messages through some system IPC mechanism, we just have this simple buffering system where they add a message to a data structure and there are thread notices that and takes it from there. And we didn't want to do any large scale code changes to the online C++ code. So these we call them fake WebSockets make the code look more or less the same. And if you want to create a similar app for other platforms like mainly Android, the same basic idea should work. You just need to write this platform specific coding in Java instead of Objective C. And also as an example and experiment, I wrote one for GTK+, and it was actually quite easy. The API that GTK+, and WebKit offers is in theory quite close to the one that you have on iOS. You can execute one line of javascript and you get callbacks when the javascript calls some specific function. Then how is this iOS app actually built? Well, it's built in an Xcode project and all these static libraries that we built in in ProfiScore, they are listed in a file and then in the Xcode project we just pass this file to the linker and it looks through all these libraries and picks what it needs. And as we don't use any dynamic linking on these platforms we have a map that's built at build time that maps these UNO component names or constructor names to function pointers. There is a Python script that generates these maps and that then decides what gets linked in basically. And typically when you run the app and if you invoke some functionality that hasn't been invoked earlier, you will notice that now it needs some component that isn't actually linked in, then you need to update this Python script and link it again and then it should work. And all these configuration files, translations, all the XML files, RC files, et cetera, they are mostly as in a normal Lib ProfiS, never a similar structure. And I thought I would go through the code a bit, see if I can switch to the... Oh, why didn't it switch? Oh, yeah, I have to just exit this one. Well, I'll start by showing the initialization stuff where we initialize the logging and language and locale stuff and we download some templates if necessary and we start the kit. So here I might now in this... Can you see this? Is it large enough? Yeah. In the online repository and in the iOS slash mobile directory. And here this app delegate, file is the one that does the initialization. Oh, here is something related to templates. And then the actual app starts in this function. The application did finish launching with options and it does some logging initialization and some language stuff. And this here is related to the template feature and it calls the Lib ProfiS kit initialization functions and then it starts a thread. This is the objective see where to start a thread asynchronously and here it creates this low WSD object which corresponds to the WSD process in the online case and it runs it and once it has run it, it just loops back and create one more. When the app starts, you first see like a document browser that shows your documents in iCloud or on your device or in some other storage extension system. And this actually is provided by the system. We didn't need to code anything for that. And then when you select the document to edit, it creates a document object and a controller for that and stuff like that. Mostly uninteresting details. And when it creates this webkit webview, it shows in that view an HTML page that corresponds to the one that is shown for an online session also and it gets passed the document URL and the UI language. What time is it by the way? Five minutes left. Wow. And in this file document.mm you can also find this send to JS code. That's the one that executes this JavaScript expression. And here this is one thing that should be improved as we can't send any binary data. We have to base64 encode everything and actually when we are sending a PNG tile, we first base64 encode it and then the receiving end decodes it but then it encodes it again to be able to use it as a data URL for the tile. And that file contains the code for the callback in the other direction, the things that receive the messages and the JavaScript part sends. And yeah, that's actually it. So any questions? Yeah? You mean like the code size? What should I say? It's like some 100 megabytes. Sorry? Yeah. And actually how much time now? Four minutes. Okay. I will show you how it works. If you have time. Does it show the whole screen now? For some reason not. Let's try again. For some reason it doesn't show the whole screen or it does, so it is there. Okay. So here is the application and this here is the file browser. Here you see what I have on my iCloud drive and here is a sample document and this all looks very much like LibreOffice online. You get the same menu bar up there and you can select stuff and use all these normal functionality or type into it and so on. I probably should not point out the obvious improvement that need to be made, but as you see one thing is that the on-screen keyboard pops up very eagerly and that should be fixed. And there is my dog and I think that's a good thing to stop with. So thank you.