> On Apr 25, 2023, at 10:35 AM, Steve Brown <sbr...@opensat.com> wrote:
> 
> The subject function takes a GncOwner as an argument, modifies it and
> returns the result through the argument. It's not clear how to create a
> Swig INOUT map for a non-primitive type. So, I wrote a wrapper to
> return the result in a normal way and indicate an error with a NULL
> return. The wrapper allocates the owner with gncOwnerNew() and returns
> a Python object of type GncOwner.
> 
> However, I need an object of type Customer, Job,... based on the owner
> type. So, on the Python side, I get the type from the instance and
> create an object of the correct type such as Vendor via
> Vendor(instance=instance). 
> 
> This works and I'm able to extract the vendor address and other data I
> need.
> 
> It's not clear how to free the owner object allocated by the wrapper. A
> call to gncOwnerFree fails in the IN typemap because the Swig pointer
> type didn't match one of the 4 alternatives. I added a
> SWIG_ConvertPtr() for GncOwner, but got the same "couldn't convert"
> message. It's not clear how to inspect the Swig pointer type to see why
> it's complaining.
> 
> This all seems overly complicated. Is there a better approach?
> 
> Also, any advice on how to not leak GncOwner.

You might combine the two parts into a single wrapper, maybe something like 
(not tested) 
GncCustomer* gncOwnerGetCustomerFromTxn(Transaction* txn)
{
    GncOwner owner = { GNC_OWNER_NONE, NULL, NULL };
    GncCustomer* customer = NULL;

    gncOwnerGetOwnerFromTxn(txn, &owner);

    if (owner->type == GNC_OWNER_CUSTOMER)
    {
        customer = gncOwnerGetCustomer(&owner);
    }

    return customer;
}


Regards,
John Ralls

_______________________________________________
gnucash-devel mailing list
gnucash-devel@gnucash.org
https://lists.gnucash.org/mailman/listinfo/gnucash-devel

Reply via email to