the documentation doesn't say if I can instantiate those classes, or does
it?

if I could understand via GIRepository.Repository if a class could be
extended/instantiated I could improve cgjs-about to show that right away.

So far I thought that `objects` where all usable as `new Class` but that's
not the case at all. Maybe I should check for an `is_abstract_object` ?

Not sure there is anything like that though.

Thanks.


On Wed, Nov 8, 2017 at 3:41 AM, <philip.chime...@gmail.com> wrote:

> This comes a bit too late to help you, sorry, but the C docs will tell you
> which classes extend a base class, e.g. for GInputStream (Gio.InputStream
> in GJS): https://developer.gnome.org/gio/stable/GInputStream.
> html#GInputStream.object-hierarchy
>
> On Tue, Nov 7, 2017 at 2:36 PM Andrea Giammarchi <
> andrea.giammar...@gmail.com> wrote:
>
>> so, just FYI ...
>>
>> Buffered, Converter, Data, File, Memory and Unix InputStream are
>> available.
>>
>> Buffered, Converter, and Data need a base_stream to work ... not a
>> primitive.
>>
>> File and Unix need attributes or fd pointers
>>
>> The Memory seems to be the "base/primitive" I was looking for together
>> with its MemoryOutputStream counterpart.
>>
>> Regards
>>
>>
>>
>> On Tue, Nov 7, 2017 at 7:28 PM, Andrea Giammarchi <
>> andrea.giammar...@gmail.com> wrote:
>>
>>> oh gosh, my own utility ... that is less useful in pretty print for
>>> these kind of things .... although the list has many non-usable streams but
>>> now I want to know which one is usable.
>>>
>>> P.S. for namespaces you don't' need gi prefix ... cgjs-about Gio would
>>> do the same ;-)
>>>
>>> Thanks again
>>>
>>> On Tue, Nov 7, 2017 at 7:09 PM, Sam Jansen <sam.jan...@starleaf.com>
>>> wrote:
>>>
>>>>
>>>>
>>>> On 7 November 2017 at 21:55, Andrea Giammarchi <
>>>> andrea.giammar...@gmail.com> wrote:
>>>>
>>>>> this is gold, thank you!!!
>>>>>
>>>>> do you know if MemoryInputStream is the only one usable? is there any
>>>>> list of available GJS streams one can use? I think memory is just fine
>>>>> though, thanks again a lot!
>>>>>
>>>>>
>>>> I just took an educated guess: I figured anything useful would extend
>>>> Gio.InputStream. I then just browsed through the docs, looking for anything
>>>> with "InputStream" in their name, which isn't so many...
>>>>
>>>> This is a good place to start perhaps:
>>>>
>>>> $ cgjs-about gi.Gio --json | grep InputStream | grep -Ev "Class|Private"
>>>>
>>>>
>>>> It would be a neat extension to cgjs-about if one could have it list
>>>> the classes known to implement an interface or extend from a class...
>>>>
>>>>
>>>>> On Tue, Nov 7, 2017 at 6:46 PM, Sam Jansen <sam.jan...@starleaf.com>
>>>>> wrote:
>>>>>
>>>>>> Hi Andrea,
>>>>>>
>>>>>> I've come up with something that... almost does what you're looking
>>>>>> at here. Perhaps it's useful as a guide of what one can do with the Gio
>>>>>> interface.
>>>>>>
>>>>>> I think you may hit some awkward problems with modelling Node-style
>>>>>> streams with GLib ones. But perhaps it is possible and this helps. I 
>>>>>> don't
>>>>>> really know the Node stream semantics so I have assumed various things in
>>>>>> my Readable implementation as you'll see... Note that MemoryInputStream
>>>>>> really is just a byte stream; so there is no guarantee you'll receive the
>>>>>> exact block of bytes that was written -- for example, when I run this I 
>>>>>> get
>>>>>> a first chunk of "12", followed by "3", "4", etc.
>>>>>>
>>>>>>
>>>>>> let Gio = imports.gi.Gio;
>>>>>> let byteArray = imports.byteArray;
>>>>>> let mainloop = imports.mainloop;
>>>>>>
>>>>>> class Readable {
>>>>>>   constructor() {
>>>>>>     this._mio = Gio.MemoryInputStream.new();
>>>>>>     this._callbacks = {};
>>>>>>     this._startNext();
>>>>>>   }
>>>>>>
>>>>>>   _startNext() {
>>>>>>     // Enqueue an async read; and re-enqueue when it finishes, so
>>>>>> we're
>>>>>>     // always waiting for data...
>>>>>>     this._mio.read_bytes_async(4096, 1, null, (source, res) => {
>>>>>> this._onData(this._mio.read_bytes_finish(res));
>>>>>>         this._startNext();
>>>>>> });
>>>>>>   }
>>>>>>
>>>>>>   _onData(bytes) {
>>>>>>     if (this._callbacks['data']) {
>>>>>>       let ba = byteArray.fromGBytes(bytes);
>>>>>>       this._callbacks['data'](ba);
>>>>>>       this._read();
>>>>>>     }
>>>>>>   }
>>>>>>
>>>>>>   push(bytes) {
>>>>>>     if (bytes == null) {
>>>>>>       mainloop.quit('main');
>>>>>>       return;
>>>>>>     }
>>>>>>     this._mio.add_bytes(bytes);
>>>>>>   }
>>>>>>
>>>>>>   on(name, callback) {
>>>>>>     this._callbacks[name] = callback;
>>>>>>     if (name === 'data') {
>>>>>>       this._read();
>>>>>>     }
>>>>>>   }
>>>>>> }
>>>>>>
>>>>>> class Counter extends Readable {
>>>>>>   constructor(opt) {
>>>>>>     super(opt);
>>>>>>     this._max = 1000;
>>>>>>     this._index = 1;
>>>>>>   }
>>>>>>
>>>>>>   _read() {
>>>>>>     const i = this._index++;
>>>>>>     if (i > this._max)
>>>>>>       this.push(null);
>>>>>>     else {
>>>>>>       const str = '' + i;
>>>>>>       const buf = byteArray.fromString(str); // Buffer.from(str,
>>>>>> 'ascii');
>>>>>>       this.push(buf);
>>>>>>     }
>>>>>>   }
>>>>>> }
>>>>>>
>>>>>> (new Counter).on('data', (str) => {
>>>>>>     print("data", str.toString());
>>>>>> });
>>>>>>
>>>>>> mainloop.run('main');
>>>>>>
>>>>>>
>>>>>> On 7 November 2017 at 10:08, Andrea Giammarchi <
>>>>>> andrea.giammar...@gmail.com> wrote:
>>>>>>
>>>>>>> I am trying to implement a stream module and apparently I have
>>>>>>> everything I need but practically I'm unable to use streams.
>>>>>>>
>>>>>>> If I instantiate a `new Gio.InputStream` I have the following error:
>>>>>>> cannot create instance of abstract (non-instantiatable) type
>>>>>>> 'GInputStream'
>>>>>>>
>>>>>>> I cannot even extend it ... so I've though "ok, maybe it's like an
>>>>>>> interface, I implement it and that's it"
>>>>>>>
>>>>>>> But then a JS class wouldn't work as base_stream for a
>>>>>>> Gio.BufferedInputStream, and if I extend the JS class to be a
>>>>>>> GObject.Object then:
>>>>>>> Gjs-WARNING **: JS ERROR: TypeError: Object is of type
>>>>>>> GObject.Object - cannot convert to GInputStream
>>>>>>>
>>>>>>> where GInputStream is the one I cannot use in the first place.
>>>>>>>
>>>>>>> I've reached full circle then so ... I wonder if anyone has any idea
>>>>>>> how to use/create/extend streams in GJS (not talking about file streams 
>>>>>>> but
>>>>>>> streams in general) or if it's even possible.
>>>>>>>
>>>>>>> In node, as example, I could do this and it will work:
>>>>>>>
>>>>>>> ```js
>>>>>>>
>>>>>>> const { Readable } = require('stream');
>>>>>>>
>>>>>>> class Counter extends Readable {
>>>>>>> constructor(opt) {
>>>>>>> super(opt);
>>>>>>> this._max = 1000;
>>>>>>> this._index = 1;
>>>>>>> }
>>>>>>>
>>>>>>> _read() {
>>>>>>> const i = this._index++;
>>>>>>> if (i > this._max)
>>>>>>> this.push(null);
>>>>>>> else {
>>>>>>> const str = '' + i;
>>>>>>> const buf = Buffer.from(str, 'ascii');
>>>>>>> this.push(buf);
>>>>>>> }
>>>>>>> }
>>>>>>> }
>>>>>>>
>>>>>>> (new Counter).on('data', console.log);
>>>>>>>
>>>>>>> ```
>>>>>>>
>>>>>>> _______________________________________________
>>>>>>> javascript-list mailing list
>>>>>>> javascript-list@gnome.org
>>>>>>> https://mail.gnome.org/mailman/listinfo/javascript-list
>>>>>>>
>>>>>>>
>>>>>>
>>>>>
>>>>
>>>
>> _______________________________________________
>> javascript-list mailing list
>> javascript-list@gnome.org
>> https://mail.gnome.org/mailman/listinfo/javascript-list
>>
>
_______________________________________________
javascript-list mailing list
javascript-list@gnome.org
https://mail.gnome.org/mailman/listinfo/javascript-list

Reply via email to