Dear MonoTouch subscribers,

The same question is here:
http://stackoverflow.com/questions/11008726/binding-of-zebra-sdk-to-monotouch

Short version: I have created a binding for Zebra native library for mobile
printers and the basic functionality works fine (wireless connection
between the printer and the iPad, writing data to streams, printing out
text, etc.)
I want to print out PDFs and images, and the native library provides the
classes for that. However, I can't get it to work from Monotouch.


Long version: I have problem binding the structure described below.

@protocol ZebraPrinterConnection
    - (BOOL) open;
    - (void) close;
    - (NSInteger) write:(NSData *)data error:(NSError **)error;
    - (NSData *)read: (NSError**)error;

@interface TcpPrinterConnection : NSObject<ZebraPrinterConnection> {
     some @private properties
}
     - (id)initWithAddress:(NSString *)anAddress andWithPort:(
NSInteger)aPort;

@interface ZebraPrinterFactory : NSObject { }
  +(id<ZebraPrinter,NSObject>) getInstance:(id<ZebraPrinterConnection,
NSObject>) connection error:(NSError**)error


The tricky part here is to obtain ZebraPrinter instance in Monotouch code.
Note how ZebraPrinterFactory wants ZebraPrinterConnection to be passed to
it, but onlyTcpPrinterConnection has an actual constructor.
The connection classes work fine when bound like this:

[BaseType (typeof (NSObject))]
[Model]
interface ZebraPrinterConnection
{

[Export ("open")] bool Open();

[Export ("close")] void Close();
[Export ("write:error:")] int Write(NSData data, out NSError error);
[Export ("read:")] NSData Read(out NSError error);

}

[BaseType (typeof(NSObject))]
interface TcpPrinterConnection : ZebraPrinterConnection
{

[Export ("initWithAddress:andWithPort:")] IntPtr Constructor (string
anAddress, int aPort);

}

Binding of ZebraPrinterFactory class is not as straightforward. If I bind
it like this:

[BaseType (typeof(NSObject))]
interface ZebraPrinterFactory
{

[Static, Export ("getInstance:error:")]

ZebraPrinter getInstance(ZebraPrinterConnection connection, out NSError
error);

}

then I try to use something like

myConn = new TcpPrinterConnection(ipAddress, port);
myConn.Open ();
ZebraPrinter zPrinter = ZebraPrinterFactory.GetInstance(myConn, out err);
// compile-time error: Cannot convert TcpPrinterConnection
into ZebraPrinterConnection

I get a compile-time error. If I change the binding for Mono to
accept TcpPrinterConnection as parameter (I've tried multiple
configurations), I get runtime exception ("System.InvalidCastException:
Cannot cast from source type to destination type.") which has no inner
exceptions and I have no idea which type could not be converted (strongly
suspecting that same conversion as above).
It's really frustrating having something ALMOST working, but not quite.

Any ideas? I'm starting to think of binding limitations already. Could
someone tell me if such structures can be bound at all?

Regards, Dmitry
_______________________________________________
MonoTouch mailing list
MonoTouch@lists.ximian.com
http://lists.ximian.com/mailman/listinfo/monotouch

Reply via email to