Win32OperatingSystem.st
changeset 9092 286c8b9e8780
parent 9089 a4f9be44b52a
child 9093 cba833917516
--- a/Win32OperatingSystem.st	Fri Feb 03 17:32:35 2006 +0100
+++ b/Win32OperatingSystem.st	Mon Feb 06 16:30:48 2006 +0100
@@ -79,6 +79,13 @@
 	privateIn:Win32OperatingSystem
 !
 
+Win32OperatingSystem::Win32Handle subclass:#Win32TypeLibraryHandle
+	instanceVariableNames:''
+	classVariableNames:''
+	poolDictionaries:''
+	privateIn:Win32OperatingSystem
+!
+
 !Win32OperatingSystem primitiveDefinitions!
 %{
 
@@ -96,6 +103,7 @@
 # define NO_GETADAPTERSINFO
 #endif
 
+#define WANT_OLE
 #define USE_H_ERRNO
 
 # if defined(i386) || defined(__i386__)
@@ -180,6 +188,7 @@
 # undef Process
 
 # include <stdarg.h> /* */
+
 # ifndef WINDOWS_H_INCLUDED
 #  define WINDOWS_H_INCLUDED
 #  include <windows.h>
@@ -189,6 +198,13 @@
 #  include <iphlpapi.h>
 # endif
 
+# ifdef WANT_OLE
+#  ifndef OLEAUTO_H_INCLUDED
+#   define OLEAUTO_H_INCLUDED
+#   include <oleauto.h>
+#  endif
+# endif
+
 # if !defined(__BORLANDC__)
 #  undef stat
 #  define stat _stat
@@ -8737,18 +8753,18 @@
 
     k := self key:'HKEY_CLASSES_ROOT\MIME\Database\Content Type\',mimeType.
     k notNil ifTrue:[
-        suffix := k valueNamed:'extension'.
-        suffix notNil ifTrue:[
-            ^ self executableForSuffix:suffix
-        ].
+	suffix := k valueNamed:'extension'.
+	suffix notNil ifTrue:[
+	    ^ self executableForSuffix:suffix
+	].
     ].
-    ^ nil 
-
-    "
-     Win32OperatingSystem::RegistryEntry executableForMimeType:'application/pdf'  
-     Win32OperatingSystem::RegistryEntry executableForMimeType:'audio/mp3'  
-     Win32OperatingSystem::RegistryEntry executableForMimeType:'video/avi'  
-     Win32OperatingSystem::RegistryEntry executableForMimeType:'application/x-zip-compressed'  
+    ^ nil
+
+    "
+     Win32OperatingSystem::RegistryEntry executableForMimeType:'application/pdf'
+     Win32OperatingSystem::RegistryEntry executableForMimeType:'audio/mp3'
+     Win32OperatingSystem::RegistryEntry executableForMimeType:'video/avi'
+     Win32OperatingSystem::RegistryEntry executableForMimeType:'application/x-zip-compressed'
     "
 !
 
@@ -8759,28 +8775,28 @@
 
     suffix := suffixArg.
     (suffix startsWith:'.') ifTrue:[
-        suffix := suffix copyFrom:2
+	suffix := suffix copyFrom:2
     ].
     k := self key:'HKEY_CLASSES_ROOT\.',suffix.
 
     k notNil ifTrue:[
-        fkey := (k valueNamed:'').
+	fkey := (k valueNamed:'').
     ].
     fkey isNil ifTrue:[
-        fkey := suffix,'_auto_file'
+	fkey := suffix,'_auto_file'
     ].
     fkey notEmptyOrNil ifTrue:[
-        k := Win32OperatingSystem::RegistryEntry key:('HKEY_CLASSES_ROOT\' , fkey , '\shell\open\command').
-        k notNil ifTrue:[
-            cmd := k valueNamed:''
-        ].
+	k := Win32OperatingSystem::RegistryEntry key:('HKEY_CLASSES_ROOT\' , fkey , '\shell\open\command').
+	k notNil ifTrue:[
+	    cmd := k valueNamed:''
+	].
     ].
 
-    ^ cmd 
-
-    "
-     self executableForSuffix:'pdf' 
-     self executableForSuffix:'zip' 
+    ^ cmd
+
+    "
+     self executableForSuffix:'pdf'
+     self executableForSuffix:'zip'
     "
 ! !
 
@@ -9515,7 +9531,7 @@
 !
 
 version
-    ^ '$Header: /cvs/stx/stx/libbasic/Win32OperatingSystem.st,v 1.193 2006-02-03 15:30:07 cg Exp $'
+    ^ '$Header: /cvs/stx/stx/libbasic/Win32OperatingSystem.st,v 1.194 2006-02-06 15:30:48 cg Exp $'
 ! !
 
 !Win32OperatingSystem::Win32FILEHandle methodsFor:'release'!
@@ -9542,7 +9558,7 @@
 !
 
 version
-    ^ '$Header: /cvs/stx/stx/libbasic/Win32OperatingSystem.st,v 1.193 2006-02-03 15:30:07 cg Exp $'
+    ^ '$Header: /cvs/stx/stx/libbasic/Win32OperatingSystem.st,v 1.194 2006-02-06 15:30:48 cg Exp $'
 ! !
 
 !Win32OperatingSystem::Win32Handle methodsFor:'io'!
@@ -9924,6 +9940,120 @@
     ^ pid
 ! !
 
+!Win32OperatingSystem::Win32SerialPortHandle methodsFor:'setup'!
+
+baudRate:newRate
+%{
+    HANDLE port = (HANDLE)(__externalAddressVal(self));
+
+    if (port
+     && __isSmallInteger(newRate)) {
+	DCB dcb;
+
+	ZeroMemory(&dcb, sizeof(dcb));
+	dcb.DCBlength = sizeof(dcb);
+	GetCommState(port, &dcb);
+
+	dcb.BaudRate = __intVal(newRate);
+
+	if (! SetCommState(port, &dcb)) {
+	    RETURN(false);
+	}
+	RETURN(true);
+    }
+%}.
+    self primitiveFailed.
+!
+
+dataBits:newNumberOfBits
+%{
+    HANDLE port = (HANDLE)(__externalAddressVal(self));
+
+    if (port
+     && __isSmallInteger(newNumberOfBits)) {
+	DCB dcb;
+
+	ZeroMemory(&dcb, sizeof(dcb));
+	dcb.DCBlength = sizeof(dcb);
+	GetCommState(port, &dcb);
+
+	dcb.ByteSize = __intVal(newNumberOfBits);
+
+	if (! SetCommState(port, &dcb)) {
+	    RETURN(false);
+	}
+	RETURN(true);
+    }
+%}.
+    self primitiveFailed.
+!
+
+stopBitsType:newStopBitsSymbol
+    "newParityTypeSymbol must be one of #stop1, #stop2 or #stop1_5"
+%{
+    HANDLE port = (HANDLE)(__externalAddressVal(self));
+
+    if (port) {
+	DCB dcb;
+
+	ZeroMemory(&dcb, sizeof(dcb));
+	dcb.DCBlength = sizeof(dcb);
+	GetCommState(port, &dcb);
+
+	if (newStopBitsSymbol == @symbol(stop1)) {
+	    dcb.Parity = 0 /* STOP1 */;
+	} else if (newStopBitsSymbol == @symbol(stop2)) {
+	    dcb.Parity = 2 /* STOP2 */;
+	} else if (newStopBitsSymbol == @symbol(stop1_5)) {
+	    dcb.Parity = 1 /* STOP1_5 */;
+	} else {
+	    goto failure;
+	}
+
+	if (! SetCommState(port, &dcb)) {
+	    RETURN(false);
+	}
+	RETURN(true);
+    }
+  failure: ;
+%}.
+    self primitiveFailed.
+!
+
+parityType:newParityTypeSymbol
+    "newParityTypeSymbol must be one of #odd, #even or #none (or nil)"
+
+%{
+    HANDLE port = (HANDLE)(__externalAddressVal(self));
+
+    if (port) {
+	DCB dcb;
+
+	ZeroMemory(&dcb, sizeof(dcb));
+	dcb.DCBlength = sizeof(dcb);
+	GetCommState(port, &dcb);
+
+
+	if ((newParityTypeSymbol == nil) || (newParityTypeSymbol == @symbol(none))) {
+	    dcb.Parity = NOPARITY;
+	} else if (newParityTypeSymbol == @symbol(odd)) {
+	    dcb.Parity = ODDPARITY;
+	} else if (newParityTypeSymbol == @symbol(even)) {
+	    dcb.Parity = EVENPARITY;
+	} else {
+	    goto failure;
+	}
+
+	if (! SetCommState(port, &dcb)) {
+	    RETURN(false);
+	}
+	RETURN(true);
+    }
+  failure: ;
+%}.
+    self primitiveFailed.
+! !
+
 !Win32OperatingSystem::Win32SerialPortHandle methodsFor:'opening'!
 
 open:portName baudRate:baudRate stopBitsType:stopBitsType
@@ -10156,118 +10286,39 @@
 %}.
 ! !
 
-!Win32OperatingSystem::Win32SerialPortHandle methodsFor:'setup'!
-
-baudRate:newRate
-%{
-    HANDLE port = (HANDLE)(__externalAddressVal(self));
-
-    if (port
-     && __isSmallInteger(newRate)) {
-	DCB dcb;
-
-	ZeroMemory(&dcb, sizeof(dcb));
-	dcb.DCBlength = sizeof(dcb);
-	GetCommState(port, &dcb);
-
-	dcb.BaudRate = __intVal(newRate);
-
-	if (! SetCommState(port, &dcb)) {
-	    RETURN(false);
-	}
-	RETURN(true);
-    }
-%}.
-    self primitiveFailed.
-!
-
-dataBits:newNumberOfBits
-%{
-    HANDLE port = (HANDLE)(__externalAddressVal(self));
-
-    if (port
-     && __isSmallInteger(newNumberOfBits)) {
-	DCB dcb;
-
-	ZeroMemory(&dcb, sizeof(dcb));
-	dcb.DCBlength = sizeof(dcb);
-	GetCommState(port, &dcb);
-
-	dcb.ByteSize = __intVal(newNumberOfBits);
-
-	if (! SetCommState(port, &dcb)) {
-	    RETURN(false);
-	}
-	RETURN(true);
-    }
-%}.
-    self primitiveFailed.
-!
-
-parityType:newParityTypeSymbol
-    "newParityTypeSymbol must be one of #odd, #even or #none (or nil)"
-
+!Win32OperatingSystem::Win32TypeLibraryHandle class methodsFor:'instance creation'!
+
+loadTypeLib:pathName
+    |errorNumber newHandle|
 %{
-    HANDLE port = (HANDLE)(__externalAddressVal(self));
-
-    if (port) {
-	DCB dcb;
-
-	ZeroMemory(&dcb, sizeof(dcb));
-	dcb.DCBlength = sizeof(dcb);
-	GetCommState(port, &dcb);
-
-
-	if ((newParityTypeSymbol == nil) || (newParityTypeSymbol == @symbol(none))) {
-	    dcb.Parity = NOPARITY;
-	} else if (newParityTypeSymbol == @symbol(odd)) {
-	    dcb.Parity = ODDPARITY;
-	} else if (newParityTypeSymbol == @symbol(even)) {
-	    dcb.Parity = EVENPARITY;
+#ifdef WANT_OLE
+    if ( __isString(pathName) ) {
+	char *__pathName = __stringVal(pathName);
+	HANDLE hTypeLib = 0;
+	int rslt;
+
+	rslt = LoadTypeLib(__pathName, &hTypeLib);
+	fprintf(stderr, "rslt: %d handle: %x\n", rslt, hTypeLib);
+	if (hTypeLib) {
+	    newHandle = __MKEXTERNALADDRESS(hTypeLib);
+	    __qClass(newHandle) = self;
+	    __STORE(newHandle, self);
 	} else {
-	    goto failure;
-	}
-
-	if (! SetCommState(port, &dcb)) {
-	    RETURN(false);
-	}
-	RETURN(true);
-    }
-  failure: ;
+	    errorNumber = __mkSmallInteger( __WIN32_ERR(GetLastError()) );
+	}
+    }
+#endif /* WANT_OLE */
 %}.
-    self primitiveFailed.
-!
-
-stopBitsType:newStopBitsSymbol
-    "newParityTypeSymbol must be one of #stop1, #stop2 or #stop1_5"
-%{
-    HANDLE port = (HANDLE)(__externalAddressVal(self));
-
-    if (port) {
-	DCB dcb;
-
-	ZeroMemory(&dcb, sizeof(dcb));
-	dcb.DCBlength = sizeof(dcb);
-	GetCommState(port, &dcb);
-
-	if (newStopBitsSymbol == @symbol(stop1)) {
-	    dcb.Parity = 0 /* STOP1 */;
-	} else if (newStopBitsSymbol == @symbol(stop2)) {
-	    dcb.Parity = 2 /* STOP2 */;
-	} else if (newStopBitsSymbol == @symbol(stop1_5)) {
-	    dcb.Parity = 1 /* STOP1_5 */;
-	} else {
-	    goto failure;
-	}
-
-	if (! SetCommState(port, &dcb)) {
-	    RETURN(false);
-	}
-	RETURN(true);
-    }
-  failure: ;
-%}.
-    self primitiveFailed.
+    newHandle notNil ifTrue:[
+	Lobby register:newHandle.
+	^ newHandle.
+    ].
+
+    errorNumber isNil ifTrue:[
+	self error:'invalid argument(s)'.
+    ] ifFalse:[
+	(OperatingSystem errorHolderForNumber:errorNumber) reportError
+    ].
 ! !
 
 !Win32OperatingSystem::Win32SocketHandle class methodsFor:'constants'!
@@ -10908,7 +10959,7 @@
 !Win32OperatingSystem class methodsFor:'documentation'!
 
 version
-    ^ '$Header: /cvs/stx/stx/libbasic/Win32OperatingSystem.st,v 1.193 2006-02-03 15:30:07 cg Exp $'
+    ^ '$Header: /cvs/stx/stx/libbasic/Win32OperatingSystem.st,v 1.194 2006-02-06 15:30:48 cg Exp $'
 ! !
 
 Win32OperatingSystem initialize!