Why not something like this:

[CCode (cheader_filename = "rados/librados.h", cname = "rados_create2")]
public static int from_config (out ClusterClient? client, string?
cluster_name, string? user_name, Flags flags);

Vala will ensure `client` is null before calling this function, if the
result is a failure, `client` will be null. It's owned, so the
`rados_shutdown` will be called. If you want it to look like a return:

[CCode (cname="g_io_error_from_errno")]
private int _g_io_error_from_errno(int errno);
[CCode (cheader_filename = "rados/librados.h", cname = "rados_create2")]
private static int _from_config (out ClusterClient? client, string?
cluster_name, string? user_name, Flags flags);
public static ClusterClient? from_config(string? cluster_name, string?
user_name, Flags flags) throw GLib.IOError {
  ClusterClient? result;
  int code;
  if ((code = _from_config(out result, cluster_name, user_name, flags)) <
0) {
    throw new Error(IOError.quark(), _g_io_error_from_errno(-code), "%s",
GLib.strerror(-code));
  }
  return (owned) result;
}

This requires depending on gio-2.0.

Also, Flags should probably be an enum.

On 22 November 2014 at 18:01, Gonzalo Aguilar Delgado <
[email protected]> wrote:

> Hi,
>
> I my case (rados lib) I found non standard anyway and trying hard to
> figure out how to do the binding. Maybe someone can help.
>
> I managed to create some kind of working stuff but I think is not really
> good with lot's of variable copying in generated code.
>
> [ The problem ]
>
> Rados want's a (void *) (formally rados_t) to be initialized on startup.
> This is done with rados_create2 function:
>
>     int rados_create2(rados_t *pcluster, const char *const clustername,
>               const char * const name, uint64_t flags);
>
> What I did is:
>
> Map flags: (ok)
>
>     [SimpleType]
>     [IntegerType (rank = 11)]
>     [CCode (cname = "uint64_t", has_type_id = false)]
> publicstruct Flags {
>     }
>
>
> Create a cluster client:
>
>
>     [CCode (cheader_filename = "rados/librados.h", cname = "void",
> free_function = "rados_shutdown", has_type_id = false)]
>     [Compact]
> publicclass ClusterClient {
>         [CCode (cheader_filename = "rados/librados.h", cname =
> "rados_create2")]
> protectedstaticint create (ref unowned ClusterClient client, string?
> cluster_name, string? user_name, Flags flags);
>
> publicstatic unowned ClusterClient? from_config(string? cluster_name,
> string? user_name, Flags flags) {
>             unowned ClusterClient result = null;
> if(create(ref result, cluster_name, user_name, flags)<0){
>                 result = null;
>             }
> return result;
>         }
>
>
>     }
>
> I code I do:
>
>     Rados.Flags flags=0;
>     unowned Rados.ClusterClient cluster = 
> Rados.ClusterClient.from_config("ceph",
> "client.admin", flags);
>
>
>
> But this makes a lot of problems in code. And of course, not calling
> rados_shutdown because unowned.
>
> What I want is to do it in a way it's everything handled in the
> constructor with no static method, but don't find how to do it.
>
> What I really want to do is:
>
>     Rados.Flags flags=0;
> Rados.ClusterClient cluster = Rados.ClusterClient("ceph", "client.admin",
> flags);
>
> And the result of the rados_create2 (first argument) being copied to
> cluster var as instance object.
>
> How should I do it?
>
> Any help will be appreciated.
>
>
> _______________________________________________
> vala-list mailing list
> [email protected]
> https://mail.gnome.org/mailman/listinfo/vala-list
>



-- 
--Andre Masella<[email protected]>
http://www.masella.name/
_______________________________________________
vala-list mailing list
[email protected]
https://mail.gnome.org/mailman/listinfo/vala-list

Reply via email to