mirror of
https://github.com/gnustep/libs-base.git
synced 2025-04-25 09:41:15 +00:00
Some MINGW fixes
git-svn-id: svn+ssh://svn.gna.org/svn/gnustep/libs/base/trunk@6846 72102866-910b-0410-8b05-ffd578937521
This commit is contained in:
parent
d5f4801280
commit
d26536528b
8 changed files with 283 additions and 263 deletions
|
@ -1,3 +1,11 @@
|
||||||
|
2000-06-30 Richard Frith-Macdonald <rfm@gnu.org>
|
||||||
|
|
||||||
|
* Headers/gnustep/base/NSDate.h: Added GSTime() function
|
||||||
|
* Source/NSDate.m: More efficient MINGW date creation
|
||||||
|
* Source/NSCalendarDate.m: optimised date creation from yymmddhhmmss
|
||||||
|
* Source/NSData.m: MINGW file read and write operations added (untested)
|
||||||
|
* Source/NSFileManager.m: MINGW file operations updated.
|
||||||
|
|
||||||
2000-06-30 Richard Frith-Macdonald <rfm@gnu.org>
|
2000-06-30 Richard Frith-Macdonald <rfm@gnu.org>
|
||||||
|
|
||||||
Coding/decoding modifications to make system more in line with
|
Coding/decoding modifications to make system more in line with
|
||||||
|
|
|
@ -107,6 +107,7 @@ typedef double NSTimeInterval;
|
||||||
@end
|
@end
|
||||||
|
|
||||||
NSTimeInterval GSTimeNow(); /* Get time since reference date*/
|
NSTimeInterval GSTimeNow(); /* Get time since reference date*/
|
||||||
|
NSTimeInterval GSTime(int day, int mon, int year, int hour, int min, int sec);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -195,7 +195,7 @@ static unsigned local_object_counter = 0;
|
||||||
+ (void) setDebug: (int)val;
|
+ (void) setDebug: (int)val;
|
||||||
- (void) handlePortMessage: (NSPortMessage*)msg;
|
- (void) handlePortMessage: (NSPortMessage*)msg;
|
||||||
|
|
||||||
- _getReceivedReplyRmcWithSequenceNumber: (int)n;
|
- _getReplyRmc: (int)n;
|
||||||
- (NSPortCoder*) _makeRmc: (int)sequence;
|
- (NSPortCoder*) _makeRmc: (int)sequence;
|
||||||
- (int) _newMsgNumber;
|
- (int) _newMsgNumber;
|
||||||
- (void) _sendRmc: (NSPortCoder*)c type: (int)msgid;
|
- (void) _sendRmc: (NSPortCoder*)c type: (int)msgid;
|
||||||
|
@ -992,7 +992,7 @@ static int messages_received_count;
|
||||||
op = [self _makeRmc: seq_num];
|
op = [self _makeRmc: seq_num];
|
||||||
[self _sendRmc: op type: ROOTPROXY_REQUEST];
|
[self _sendRmc: op type: ROOTPROXY_REQUEST];
|
||||||
|
|
||||||
ip = [self _getReceivedReplyRmcWithSequenceNumber: seq_num];
|
ip = [self _getReplyRmc: seq_num];
|
||||||
[ip decodeValueOfObjCType: @encode(id) at: &newProxy];
|
[ip decodeValueOfObjCType: @encode(id) at: &newProxy];
|
||||||
return AUTORELEASE(newProxy);
|
return AUTORELEASE(newProxy);
|
||||||
}
|
}
|
||||||
|
@ -1264,7 +1264,7 @@ static int messages_received_count;
|
||||||
}
|
}
|
||||||
/* xxx Why do we get the reply packet in here, and not
|
/* xxx Why do we get the reply packet in here, and not
|
||||||
just before calling dissect_method_return() below? */
|
just before calling dissect_method_return() below? */
|
||||||
ip = [self _getReceivedReplyRmcWithSequenceNumber: seq_num];
|
ip = [self _getReplyRmc: seq_num];
|
||||||
/* Find out if the server is returning an exception instead
|
/* Find out if the server is returning an exception instead
|
||||||
of the return values. */
|
of the return values. */
|
||||||
[ip decodeValueOfObjCType: @encode(BOOL) at: &is_exception];
|
[ip decodeValueOfObjCType: @encode(BOOL) at: &is_exception];
|
||||||
|
@ -1318,7 +1318,7 @@ static int messages_received_count;
|
||||||
[op encodeValueOfObjCType: ":" at: &sel];
|
[op encodeValueOfObjCType: ":" at: &sel];
|
||||||
[op encodeValueOfObjCType: @encode(unsigned) at: &target];
|
[op encodeValueOfObjCType: @encode(unsigned) at: &target];
|
||||||
[self _sendRmc: op type: METHODTYPE_REQUEST];
|
[self _sendRmc: op type: METHODTYPE_REQUEST];
|
||||||
ip = [self _getReceivedReplyRmcWithSequenceNumber: seq_num];
|
ip = [self _getReplyRmc: seq_num];
|
||||||
[ip decodeValueOfObjCType: @encode(char*) at: &type];
|
[ip decodeValueOfObjCType: @encode(char*) at: &type];
|
||||||
return type;
|
return type;
|
||||||
}
|
}
|
||||||
|
@ -1510,156 +1510,6 @@ static int messages_received_count;
|
||||||
debug_connection = val;
|
debug_connection = val;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/* Methods for handling client and server, requests and replies */
|
|
||||||
|
|
||||||
/* NSDistantObject's -forward: : method calls this to the the message over the wire. */
|
|
||||||
- (retval_t) forwardForProxy: (NSDistantObject*)object
|
|
||||||
selector: (SEL)sel
|
|
||||||
argFrame: (arglist_t)argframe
|
|
||||||
{
|
|
||||||
NSPortCoder *op;
|
|
||||||
|
|
||||||
/* The callback for encoding the args of the method call. */
|
|
||||||
void encoder (int argnum, void *datum, const char *type, int flags)
|
|
||||||
{
|
|
||||||
#define ENCODED_ARGNAME @"argument value"
|
|
||||||
switch (*type)
|
|
||||||
{
|
|
||||||
case _C_ID:
|
|
||||||
if (flags & _F_BYCOPY)
|
|
||||||
[op encodeBycopyObject: *(id*)datum];
|
|
||||||
#ifdef _F_BYREF
|
|
||||||
else if (flags & _F_BYREF)
|
|
||||||
[op encodeByrefObject: *(id*)datum];
|
|
||||||
#endif
|
|
||||||
else
|
|
||||||
[op encodeObject: *(id*)datum];
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
[op encodeValueOfObjCType: type at: datum];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Encode the method on an RMC, and send it. */
|
|
||||||
{
|
|
||||||
BOOL out_parameters;
|
|
||||||
const char *type;
|
|
||||||
int seq_num;
|
|
||||||
retval_t retframe;
|
|
||||||
|
|
||||||
NSParameterAssert (_isValid);
|
|
||||||
|
|
||||||
/* get the method types from the selector */
|
|
||||||
#if NeXT_runtime
|
|
||||||
[NSException
|
|
||||||
raise: NSGenericException
|
|
||||||
format: @"Sorry, distributed objects does not work with NeXT runtime"];
|
|
||||||
/* type = [object selectorTypeForProxy: sel]; */
|
|
||||||
#else
|
|
||||||
type = sel_get_type(sel);
|
|
||||||
#endif
|
|
||||||
if (type == 0 || *type == '\0') {
|
|
||||||
type = [[object methodSignatureForSelector: sel] methodType];
|
|
||||||
if (type) {
|
|
||||||
sel_register_typed_name(sel_get_name(sel), type);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
NSParameterAssert(type);
|
|
||||||
NSParameterAssert(*type);
|
|
||||||
|
|
||||||
seq_num = [self _newMsgNumber];
|
|
||||||
op = [self _makeRmc: seq_num];
|
|
||||||
|
|
||||||
if (debug_connection > 4)
|
|
||||||
NSLog(@"building packet seq %d", seq_num);
|
|
||||||
|
|
||||||
/* Send the types that we're using, so that the performer knows
|
|
||||||
exactly what qualifiers we're using.
|
|
||||||
If all selectors included qualifiers, and if I could make
|
|
||||||
sel_types_match() work the way I wanted, we wouldn't need to do
|
|
||||||
this. */
|
|
||||||
[op encodeValueOfObjCType: @encode(char*) at: &type];
|
|
||||||
|
|
||||||
/* xxx This doesn't work with proxies and the NeXT runtime because
|
|
||||||
type may be a method_type from a remote machine with a
|
|
||||||
different architecture, and its argframe layout specifiers
|
|
||||||
won't be right for this machine! */
|
|
||||||
out_parameters = mframe_dissect_call (argframe, type, encoder);
|
|
||||||
|
|
||||||
[self _sendRmc: op type: METHOD_REQUEST];
|
|
||||||
|
|
||||||
if (debug_connection > 1)
|
|
||||||
NSLog(@"Sent message to 0x%x", (gsaddr)self);
|
|
||||||
|
|
||||||
/* Get the reply rmc, and decode it. */
|
|
||||||
{
|
|
||||||
NSPortCoder *ip = nil;
|
|
||||||
BOOL is_exception = NO;
|
|
||||||
|
|
||||||
void decoder(int argnum, void *datum, const char *type, int flags)
|
|
||||||
{
|
|
||||||
if (type == 0) {
|
|
||||||
if (ip) {
|
|
||||||
/* this must be here to avoid trashing alloca'ed retframe */
|
|
||||||
[ip dismiss];
|
|
||||||
ip = (id)-1;
|
|
||||||
}
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
/* If we didn't get the reply packet yet, get it now. */
|
|
||||||
if (!ip)
|
|
||||||
{
|
|
||||||
if (!_isValid)
|
|
||||||
{
|
|
||||||
[NSException raise: NSGenericException
|
|
||||||
format: @"connection waiting for request was shut down"];
|
|
||||||
}
|
|
||||||
/* xxx Why do we get the reply packet in here, and not
|
|
||||||
just before calling dissect_method_return() below? */
|
|
||||||
ip = [self _getReceivedReplyRmcWithSequenceNumber: seq_num];
|
|
||||||
/* Find out if the server is returning an exception instead
|
|
||||||
of the return values. */
|
|
||||||
[ip decodeValueOfObjCType: @encode(BOOL) at: &is_exception];
|
|
||||||
if (is_exception)
|
|
||||||
{
|
|
||||||
/* Decode the exception object, and raise it. */
|
|
||||||
id exc;
|
|
||||||
[ip decodeValueOfObjCType: @encode(id) at: &exc];
|
|
||||||
[ip dismiss];
|
|
||||||
ip = (id)-1;
|
|
||||||
/* xxx Is there anything else to clean up in
|
|
||||||
dissect_method_return()? */
|
|
||||||
[exc raise];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
[ip decodeValueOfObjCType: type at: datum];
|
|
||||||
/* -decodeValueOfObjCType: at: malloc's new memory
|
|
||||||
for char*'s. We need to make sure it gets freed eventually
|
|
||||||
so we don't have a memory leak. Request here that it be
|
|
||||||
autorelease'ed. Also autorelease created objects. */
|
|
||||||
if (*type == _C_CHARPTR)
|
|
||||||
[NSData dataWithBytesNoCopy: *(void**)datum length: 1];
|
|
||||||
else if (*type == _C_ID)
|
|
||||||
[*(id*)datum autorelease];
|
|
||||||
}
|
|
||||||
|
|
||||||
retframe = mframe_build_return (argframe, type, out_parameters,
|
|
||||||
decoder);
|
|
||||||
/* Make sure we processed all arguments, and dismissed the IP.
|
|
||||||
IP is always set to -1 after being dismissed; the only places
|
|
||||||
this is done is in this function DECODER(). IP will be nil
|
|
||||||
if mframe_build_return() never called DECODER(), i.e. when
|
|
||||||
we are just returning (void).*/
|
|
||||||
NSAssert(ip == (id)-1 || ip == nil, NSInternalInconsistencyException);
|
|
||||||
_repInCount++; /* received a reply */
|
|
||||||
return retframe;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* NSConnection calls this to service the incoming method request. */
|
/* NSConnection calls this to service the incoming method request. */
|
||||||
- (void) _service_forwardForProxy: (NSPortCoder*)aRmc
|
- (void) _service_forwardForProxy: (NSPortCoder*)aRmc
|
||||||
{
|
{
|
||||||
|
@ -1958,14 +1808,12 @@ static int messages_received_count;
|
||||||
[self runConnectionUntilDate: [NSDate distantFuture]];
|
[self runConnectionUntilDate: [NSDate distantFuture]];
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Deal with an RMC, either by queuing it for later service, or
|
/*
|
||||||
by servicing it right away. This method is called by the
|
* Check the queue, then try to get it from the network by waiting
|
||||||
_receivePort's received-packet-invocation. */
|
* while we run the NSRunLoop. Raise exception if we don't get anything
|
||||||
|
* before timing out.
|
||||||
/* Check the queue, then try to get it from the network by waiting
|
*/
|
||||||
while we run the NSRunLoop. Raise exception if we don't get anything
|
- _getReplyRmc: (int)sn
|
||||||
before timing out. */
|
|
||||||
- _getReceivedReplyRmcWithSequenceNumber: (int)sn
|
|
||||||
{
|
{
|
||||||
NSPortCoder *rmc;
|
NSPortCoder *rmc;
|
||||||
NSDate *timeout_date = nil;
|
NSDate *timeout_date = nil;
|
||||||
|
@ -2016,7 +1864,6 @@ static int messages_received_count;
|
||||||
|
|
||||||
- (void) _sendRmc: (NSPortCoder*)c type: (int)msgid
|
- (void) _sendRmc: (NSPortCoder*)c type: (int)msgid
|
||||||
{
|
{
|
||||||
NSPortMessage *message;
|
|
||||||
NSDate *limit;
|
NSDate *limit;
|
||||||
BOOL raiseException = NO;
|
BOOL raiseException = NO;
|
||||||
NSMutableArray *components = [c _components];
|
NSMutableArray *components = [c _components];
|
||||||
|
@ -2033,12 +1880,12 @@ static int messages_received_count;
|
||||||
}
|
}
|
||||||
[components addObject: d];
|
[components addObject: d];
|
||||||
}
|
}
|
||||||
message = [[NSPortMessage alloc] initWithSendPort: [self sendPort]
|
|
||||||
receivePort: [self receivePort]
|
|
||||||
components: components];
|
|
||||||
[message setMsgid: msgid];
|
|
||||||
limit = [NSDate dateWithTimeIntervalSinceNow: [self requestTimeout]];
|
limit = [NSDate dateWithTimeIntervalSinceNow: [self requestTimeout]];
|
||||||
if ([message sendBeforeDate: limit] == NO)
|
if ([_sendPort sendBeforeDate: limit
|
||||||
|
msgid: msgid
|
||||||
|
components: components
|
||||||
|
from: _receivePort
|
||||||
|
reserved: [_sendPort reservedSpaceLength]] == NO)
|
||||||
{
|
{
|
||||||
NSString *text;
|
NSString *text;
|
||||||
|
|
||||||
|
@ -2275,7 +2122,7 @@ static int messages_received_count;
|
||||||
[op encodeValueOfObjCType: @encode(typeof(target)) at: &target];
|
[op encodeValueOfObjCType: @encode(typeof(target)) at: &target];
|
||||||
[self _sendRmc: op type: PROXY_RETAIN];
|
[self _sendRmc: op type: PROXY_RETAIN];
|
||||||
|
|
||||||
ip = [self _getReceivedReplyRmcWithSequenceNumber: seq_num];
|
ip = [self _getReplyRmc: seq_num];
|
||||||
[ip decodeValueOfObjCType: @encode(id) at: &result];
|
[ip decodeValueOfObjCType: @encode(id) at: &result];
|
||||||
if (result != nil)
|
if (result != nil)
|
||||||
NSLog(@"failed to retain target - %@", result);
|
NSLog(@"failed to retain target - %@", result);
|
||||||
|
|
|
@ -51,6 +51,9 @@
|
||||||
|
|
||||||
extern int errno;
|
extern int errno;
|
||||||
|
|
||||||
|
#define DO_LOCK(X) {NSDebugMLLog(@"GSTcpHandle",@"lock %@",X); [X lock];}
|
||||||
|
#define DO_UNLOCK(X) {NSDebugMLLog(@"GSTcpHandle",@"unlock %@",X); [X unlock];}
|
||||||
|
|
||||||
#define GS_CONNECTION_MSG 0
|
#define GS_CONNECTION_MSG 0
|
||||||
#define NETBLOCK 8192
|
#define NETBLOCK 8192
|
||||||
|
|
||||||
|
@ -241,7 +244,7 @@ decodePort(NSData *data)
|
||||||
pnum = GSSwapBigI16ToHost(pi->num);
|
pnum = GSSwapBigI16ToHost(pi->num);
|
||||||
addr = [NSString stringWithCString: pi->addr];
|
addr = [NSString stringWithCString: pi->addr];
|
||||||
|
|
||||||
NSDebugLLog(@"NSPort", @"Decoded port as '%@:%d'", addr, pnum);
|
NSDebugFLLog(@"NSPort", @"Decoded port as '%@:%d'", addr, pnum);
|
||||||
|
|
||||||
host = [NSHost hostWithAddress: addr];
|
host = [NSHost hostWithAddress: addr];
|
||||||
return [GSTcpPort portWithNumber: pnum
|
return [GSTcpPort portWithNumber: pnum
|
||||||
|
@ -293,7 +296,7 @@ encodePort(GSTcpPort *port)
|
||||||
pi->num = GSSwapHostI16ToBig(pnum);
|
pi->num = GSSwapHostI16ToBig(pnum);
|
||||||
[addr getCString: pi->addr];
|
[addr getCString: pi->addr];
|
||||||
|
|
||||||
NSDebugLLog(@"NSPort", @"Encoded port as '%@:%d'", addr, pnum);
|
NSDebugFLLog(@"NSPort", @"Encoded port as '%@:%d'", addr, pnum);
|
||||||
|
|
||||||
return data;
|
return data;
|
||||||
}
|
}
|
||||||
|
@ -348,7 +351,7 @@ encodePort(GSTcpPort *port)
|
||||||
BOOL gotAddr = NO;
|
BOOL gotAddr = NO;
|
||||||
NSRunLoop *l;
|
NSRunLoop *l;
|
||||||
|
|
||||||
NSDebugLLog(@"GSTcpHandle", @"Connecting before %@", when);
|
NSDebugMLLog(@"GSTcpHandle", @"Connecting before %@", when);
|
||||||
if (state != GS_H_UNCON)
|
if (state != GS_H_UNCON)
|
||||||
{
|
{
|
||||||
NSLog(@"attempting connect on connected handle");
|
NSLog(@"attempting connect on connected handle");
|
||||||
|
@ -469,7 +472,7 @@ encodePort(GSTcpPort *port)
|
||||||
DESTROY(rData);
|
DESTROY(rData);
|
||||||
DESTROY(rItems);
|
DESTROY(rItems);
|
||||||
DESTROY(wMsgs);
|
DESTROY(wMsgs);
|
||||||
RELEASE(myLock);
|
DESTROY(myLock);
|
||||||
[super dealloc];
|
[super dealloc];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -502,15 +505,15 @@ encodePort(GSTcpPort *port)
|
||||||
|
|
||||||
- (void) invalidate
|
- (void) invalidate
|
||||||
{
|
{
|
||||||
[myLock lock];
|
DO_LOCK(myLock);
|
||||||
if (valid == YES)
|
if (valid == YES)
|
||||||
{
|
{
|
||||||
valid = NO;
|
valid = NO;
|
||||||
NSDebugLLog(@"GSTcpHandle", @"invalidated");
|
NSDebugMLLog(@"GSTcpHandle", @"invalidated", 0);
|
||||||
[[self recvPort] removeHandle: self];
|
[[self recvPort] removeHandle: self];
|
||||||
[[self sendPort] removeHandle: self];
|
[[self sendPort] removeHandle: self];
|
||||||
}
|
}
|
||||||
[myLock unlock];
|
DO_UNLOCK(myLock);
|
||||||
}
|
}
|
||||||
|
|
||||||
- (BOOL) isValid
|
- (BOOL) isValid
|
||||||
|
@ -531,7 +534,7 @@ encodePort(GSTcpPort *port)
|
||||||
extra: (void*)extra
|
extra: (void*)extra
|
||||||
forMode: (NSString*)mode
|
forMode: (NSString*)mode
|
||||||
{
|
{
|
||||||
NSDebugLLog(@"GSTcpHandle", @"Received %s event",
|
NSDebugMLLog(@"GSTcpHandle", @"received %s event",
|
||||||
type == ET_RPORT ? "read" : "write");
|
type == ET_RPORT ? "read" : "write");
|
||||||
/*
|
/*
|
||||||
* If we have been invalidated (desc < 0) then we should ignore this
|
* If we have been invalidated (desc < 0) then we should ignore this
|
||||||
|
@ -589,7 +592,7 @@ encodePort(GSTcpPort *port)
|
||||||
{
|
{
|
||||||
if (res == 0)
|
if (res == 0)
|
||||||
{
|
{
|
||||||
NSDebugLLog(@"GSTcpHandle", @"read attempt failed - eof");
|
NSDebugMLLog(@"GSTcpHandle", @"read attempt failed - eof", 0);
|
||||||
[self invalidate];
|
[self invalidate];
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -601,7 +604,7 @@ encodePort(GSTcpPort *port)
|
||||||
}
|
}
|
||||||
res = 0; /* Interrupted - continue */
|
res = 0; /* Interrupted - continue */
|
||||||
}
|
}
|
||||||
NSDebugLLog(@"GSTcpHandle", @"read %d bytes", res);
|
NSDebugMLLog(@"GSTcpHandle", @"read %d bytes", res);
|
||||||
rLength += res;
|
rLength += res;
|
||||||
|
|
||||||
|
|
||||||
|
@ -801,7 +804,7 @@ encodePort(GSTcpPort *port)
|
||||||
len = write(desc, [d bytes], [d length]);
|
len = write(desc, [d bytes], [d length]);
|
||||||
if (len == [d length])
|
if (len == [d length])
|
||||||
{
|
{
|
||||||
NSDebugLLog(@"GSTcpHandle", @"wrote %d bytes", len);
|
NSDebugMLLog(@"GSTcpHandle", @"wrote %d bytes", len);
|
||||||
state = GS_H_CONNECTED;
|
state = GS_H_CONNECTED;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -846,7 +849,7 @@ encodePort(GSTcpPort *port)
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
NSDebugLLog(@"GSTcpHandle", @"wrote %d bytes", res);
|
NSDebugMLLog(@"GSTcpHandle", @"wrote %d bytes", res);
|
||||||
wLength += res;
|
wLength += res;
|
||||||
if (wLength == l)
|
if (wLength == l)
|
||||||
{
|
{
|
||||||
|
@ -886,7 +889,7 @@ encodePort(GSTcpPort *port)
|
||||||
BOOL sent = NO;
|
BOOL sent = NO;
|
||||||
|
|
||||||
NSAssert([components count] > 0, NSInternalInconsistencyException);
|
NSAssert([components count] > 0, NSInternalInconsistencyException);
|
||||||
NSDebugLLog(@"GSTcpHandle", @"Sending message before %@", when);
|
NSDebugMLLog(@"GSTcpHandle", @"Sending message before %@", when);
|
||||||
[wMsgs addObject: components];
|
[wMsgs addObject: components];
|
||||||
|
|
||||||
l = [NSRunLoop currentRunLoop];
|
l = [NSRunLoop currentRunLoop];
|
||||||
|
@ -911,7 +914,7 @@ encodePort(GSTcpPort *port)
|
||||||
sent = YES;
|
sent = YES;
|
||||||
}
|
}
|
||||||
RELEASE(self);
|
RELEASE(self);
|
||||||
NSDebugLLog(@"GSTcpHandle", @"Message send %d", sent);
|
NSDebugMLLog(@"GSTcpHandle", @"Message send %d", sent);
|
||||||
return sent;
|
return sent;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1156,7 +1159,7 @@ static NSMapTable *tcpPortMap = 0;
|
||||||
* Ok - now add the port for the host
|
* Ok - now add the port for the host
|
||||||
*/
|
*/
|
||||||
NSMapInsert(thePorts, (void*)aHost, (void*)port);
|
NSMapInsert(thePorts, (void*)aHost, (void*)port);
|
||||||
NSDebugLLog(@"NSPort", @"Created listening port: %@", port);
|
NSDebugMLLog(@"NSPort", @"Created listening port: %@", port);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -1180,13 +1183,13 @@ static NSMapTable *tcpPortMap = 0;
|
||||||
* Record the port by host.
|
* Record the port by host.
|
||||||
*/
|
*/
|
||||||
NSMapInsert(thePorts, (void*)aHost, (void*)port);
|
NSMapInsert(thePorts, (void*)aHost, (void*)port);
|
||||||
NSDebugLLog(@"NSPort", @"Created speaking port: %@", port);
|
NSDebugMLLog(@"NSPort", @"Created speaking port: %@", port);
|
||||||
}
|
}
|
||||||
IF_NO_GC(AUTORELEASE(port));
|
IF_NO_GC(AUTORELEASE(port));
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
NSDebugLLog(@"NSPort", @"Using pre-existing port: %@", port);
|
NSDebugMLLog(@"NSPort", @"Using pre-existing port: %@", port);
|
||||||
}
|
}
|
||||||
|
|
||||||
[tcpPortLock unlock];
|
[tcpPortLock unlock];
|
||||||
|
@ -1195,7 +1198,7 @@ static NSMapTable *tcpPortMap = 0;
|
||||||
|
|
||||||
- (void) addHandle: (GSTcpHandle*)handle forSend: (BOOL)send
|
- (void) addHandle: (GSTcpHandle*)handle forSend: (BOOL)send
|
||||||
{
|
{
|
||||||
[myLock lock];
|
DO_LOCK(myLock);
|
||||||
if (send == YES)
|
if (send == YES)
|
||||||
{
|
{
|
||||||
if (handle->caller == YES)
|
if (handle->caller == YES)
|
||||||
|
@ -1208,7 +1211,7 @@ static NSMapTable *tcpPortMap = 0;
|
||||||
handle->recvPort = GS_GC_HIDE(self);
|
handle->recvPort = GS_GC_HIDE(self);
|
||||||
}
|
}
|
||||||
NSMapInsert(handles, (void*)(gsaddr)[handle descriptor], (void*)handle);
|
NSMapInsert(handles, (void*)(gsaddr)[handle descriptor], (void*)handle);
|
||||||
[myLock unlock];
|
DO_UNLOCK(myLock);
|
||||||
}
|
}
|
||||||
|
|
||||||
- (NSString*) address
|
- (NSString*) address
|
||||||
|
@ -1223,7 +1226,7 @@ static NSMapTable *tcpPortMap = 0;
|
||||||
|
|
||||||
- (void) dealloc
|
- (void) dealloc
|
||||||
{
|
{
|
||||||
[self invalidate];
|
[self gcFinalize];
|
||||||
DESTROY(host);
|
DESTROY(host);
|
||||||
[super dealloc];
|
[super dealloc];
|
||||||
}
|
}
|
||||||
|
@ -1253,7 +1256,7 @@ static NSMapTable *tcpPortMap = 0;
|
||||||
int sock;
|
int sock;
|
||||||
GSTcpHandle *handle;
|
GSTcpHandle *handle;
|
||||||
|
|
||||||
[myLock lock];
|
DO_LOCK(myLock);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Make sure there is enough room in the provided array.
|
* Make sure there is enough room in the provided array.
|
||||||
|
@ -1274,7 +1277,7 @@ static NSMapTable *tcpPortMap = 0;
|
||||||
{
|
{
|
||||||
fds[(*count)++] = sock;
|
fds[(*count)++] = sock;
|
||||||
}
|
}
|
||||||
[myLock unlock];
|
DO_UNLOCK(myLock);
|
||||||
}
|
}
|
||||||
|
|
||||||
- (GSTcpHandle*) handleForPort: (GSTcpPort*)recvPort beforeDate: (NSDate*)when
|
- (GSTcpHandle*) handleForPort: (GSTcpPort*)recvPort beforeDate: (NSDate*)when
|
||||||
|
@ -1283,7 +1286,7 @@ static NSMapTable *tcpPortMap = 0;
|
||||||
int sock;
|
int sock;
|
||||||
GSTcpHandle *handle = nil;
|
GSTcpHandle *handle = nil;
|
||||||
|
|
||||||
[myLock lock];
|
DO_LOCK(myLock);
|
||||||
/*
|
/*
|
||||||
* Enumerate all our socket handles, and look for one with port.
|
* Enumerate all our socket handles, and look for one with port.
|
||||||
*/
|
*/
|
||||||
|
@ -1292,7 +1295,7 @@ static NSMapTable *tcpPortMap = 0;
|
||||||
{
|
{
|
||||||
if ([handle recvPort] == recvPort)
|
if ([handle recvPort] == recvPort)
|
||||||
{
|
{
|
||||||
[myLock unlock];
|
DO_UNLOCK(myLock);
|
||||||
return handle;
|
return handle;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1320,7 +1323,7 @@ static NSMapTable *tcpPortMap = 0;
|
||||||
[recvPort addHandle: handle forSend: NO];
|
[recvPort addHandle: handle forSend: NO];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
[myLock unlock];
|
DO_UNLOCK(myLock);
|
||||||
/*
|
/*
|
||||||
* If we succeeded in creating a new handle - connect to remote host.
|
* If we succeeded in creating a new handle - connect to remote host.
|
||||||
*/
|
*/
|
||||||
|
@ -1341,12 +1344,12 @@ static NSMapTable *tcpPortMap = 0;
|
||||||
|
|
||||||
if (d == nil)
|
if (d == nil)
|
||||||
{
|
{
|
||||||
NSDebugLLog(@"NSPort", @"No delegate to handle incoming message");
|
NSDebugMLLog(@"NSPort", @"No delegate to handle incoming message", 0);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if ([d respondsToSelector: @selector(handlePortMessage:)] == NO)
|
if ([d respondsToSelector: @selector(handlePortMessage:)] == NO)
|
||||||
{
|
{
|
||||||
NSDebugLLog(@"NSPort", @"delegate doesn't handle messages");
|
NSDebugMLLog(@"NSPort", @"delegate doesn't handle messages", 0);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
[d handlePortMessage: m];
|
[d handlePortMessage: m];
|
||||||
|
@ -1371,7 +1374,7 @@ static NSMapTable *tcpPortMap = 0;
|
||||||
|
|
||||||
- (void) invalidate
|
- (void) invalidate
|
||||||
{
|
{
|
||||||
[myLock lock];
|
DO_LOCK(myLock);
|
||||||
|
|
||||||
if ([self isValid])
|
if ([self isValid])
|
||||||
{
|
{
|
||||||
|
@ -1404,8 +1407,7 @@ static NSMapTable *tcpPortMap = 0;
|
||||||
handles = 0;
|
handles = 0;
|
||||||
[super invalidate];
|
[super invalidate];
|
||||||
}
|
}
|
||||||
[myLock unlock];
|
DO_UNLOCK(myLock);
|
||||||
DESTROY(myLock);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
- (BOOL) isEqual: (id)anObject
|
- (BOOL) isEqual: (id)anObject
|
||||||
|
@ -1462,10 +1464,10 @@ static NSMapTable *tcpPortMap = 0;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
[myLock lock];
|
DO_LOCK(myLock);
|
||||||
handle = (GSTcpHandle*)NSMapGet(handles, (void*)(gsaddr)desc);
|
handle = (GSTcpHandle*)NSMapGet(handles, (void*)(gsaddr)desc);
|
||||||
AUTORELEASE(RETAIN(handle));
|
AUTORELEASE(RETAIN(handle));
|
||||||
[myLock unlock];
|
DO_UNLOCK(myLock);
|
||||||
if (handle == nil)
|
if (handle == nil)
|
||||||
{
|
{
|
||||||
NSLog(@"No handle for event on descriptor %d", desc);
|
NSLog(@"No handle for event on descriptor %d", desc);
|
||||||
|
@ -1484,7 +1486,7 @@ static NSMapTable *tcpPortMap = 0;
|
||||||
*/
|
*/
|
||||||
- (void) removeHandle: (GSTcpHandle*)handle
|
- (void) removeHandle: (GSTcpHandle*)handle
|
||||||
{
|
{
|
||||||
[myLock lock];
|
DO_LOCK(myLock);
|
||||||
if ([handle sendPort] == self)
|
if ([handle sendPort] == self)
|
||||||
{
|
{
|
||||||
if (handle->caller == YES)
|
if (handle->caller == YES)
|
||||||
|
@ -1502,7 +1504,7 @@ static NSMapTable *tcpPortMap = 0;
|
||||||
{
|
{
|
||||||
[self invalidate];
|
[self invalidate];
|
||||||
}
|
}
|
||||||
[myLock unlock];
|
DO_UNLOCK(myLock);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -47,6 +47,60 @@
|
||||||
|
|
||||||
#define GREGORIAN_REFERENCE 730486
|
#define GREGORIAN_REFERENCE 730486
|
||||||
|
|
||||||
|
static inline int
|
||||||
|
lastDayOfGregorianMonth(int year, int month)
|
||||||
|
{
|
||||||
|
switch (month)
|
||||||
|
{
|
||||||
|
case 2:
|
||||||
|
if ((((year % 4) == 0) && ((year % 100) != 0))
|
||||||
|
|| ((year % 400) == 0))
|
||||||
|
return 29;
|
||||||
|
else
|
||||||
|
return 28;
|
||||||
|
case 4:
|
||||||
|
case 6:
|
||||||
|
case 9:
|
||||||
|
case 11: return 30;
|
||||||
|
default: return 31;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline int
|
||||||
|
absoluteGregorianDay(int day, int month, int year)
|
||||||
|
{
|
||||||
|
int m, N;
|
||||||
|
|
||||||
|
N = day; // day of month
|
||||||
|
for (m = month - 1; m > 0; m--) // days in prior months this year
|
||||||
|
N = N + lastDayOfGregorianMonth(m, year);
|
||||||
|
return
|
||||||
|
(N // days this year
|
||||||
|
+ 365 * (year - 1) // days in previous years ignoring leap days
|
||||||
|
+ (year - 1)/4 // Julian leap days before this year...
|
||||||
|
- (year - 1)/100 // ...minus prior century years...
|
||||||
|
+ (year - 1)/400); // ...plus prior years divisible by 400
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* External - so NSDate can use it.
|
||||||
|
*/
|
||||||
|
NSTimeInterval
|
||||||
|
GSTime(int day, int month, int year, int h, int m, int s)
|
||||||
|
{
|
||||||
|
NSTimeInterval a;
|
||||||
|
|
||||||
|
a = (NSTimeInterval)absoluteGregorianDay(day, month, year);
|
||||||
|
|
||||||
|
// Calculate date as GMT
|
||||||
|
a -= GREGORIAN_REFERENCE;
|
||||||
|
a = (NSTimeInterval)a * 86400;
|
||||||
|
a += h * 3600;
|
||||||
|
a += m * 60;
|
||||||
|
a += s;
|
||||||
|
return a;
|
||||||
|
}
|
||||||
|
|
||||||
@interface NSCalendarDate (Private)
|
@interface NSCalendarDate (Private)
|
||||||
|
|
||||||
- (void)getYear: (int *)year month: (int *)month day: (int *)day
|
- (void)getYear: (int *)year month: (int *)month day: (int *)day
|
||||||
|
@ -628,18 +682,11 @@
|
||||||
second: (unsigned int)second
|
second: (unsigned int)second
|
||||||
timeZone: (NSTimeZone *)aTimeZone
|
timeZone: (NSTimeZone *)aTimeZone
|
||||||
{
|
{
|
||||||
int a;
|
|
||||||
int c;
|
int c;
|
||||||
NSTimeInterval s;
|
NSTimeInterval s;
|
||||||
|
|
||||||
a = [self absoluteGregorianDay: day month: month year: year];
|
|
||||||
|
|
||||||
// Calculate date as GMT
|
// Calculate date as GMT
|
||||||
a -= GREGORIAN_REFERENCE;
|
s = GSTime(day, month, year, hour, minute, second);
|
||||||
s = (double)a * 86400;
|
|
||||||
s += hour * 3600;
|
|
||||||
s += minute * 60;
|
|
||||||
s += second;
|
|
||||||
|
|
||||||
// Assign time zone detail
|
// Assign time zone detail
|
||||||
_time_zone = RETAIN([aTimeZone
|
_time_zone = RETAIN([aTimeZone
|
||||||
|
@ -800,7 +847,7 @@
|
||||||
day: &d month: &m year: &y];
|
day: &d month: &m year: &y];
|
||||||
days = d;
|
days = d;
|
||||||
for (i = m - 1; i > 0; i--) // days in prior months this year
|
for (i = m - 1; i > 0; i--) // days in prior months this year
|
||||||
days = days + [self lastDayOfGregorianMonth: i year: y];
|
days = days + lastDayOfGregorianMonth(i, y);
|
||||||
|
|
||||||
return days;
|
return days;
|
||||||
}
|
}
|
||||||
|
@ -1240,34 +1287,12 @@
|
||||||
|
|
||||||
- (int) lastDayOfGregorianMonth: (int)month year: (int)year
|
- (int) lastDayOfGregorianMonth: (int)month year: (int)year
|
||||||
{
|
{
|
||||||
switch (month) {
|
return lastDayOfGregorianMonth(month, year);
|
||||||
case 2:
|
|
||||||
if ((((year % 4) == 0) && ((year % 100) != 0))
|
|
||||||
|| ((year % 400) == 0))
|
|
||||||
return 29;
|
|
||||||
else
|
|
||||||
return 28;
|
|
||||||
case 4:
|
|
||||||
case 6:
|
|
||||||
case 9:
|
|
||||||
case 11: return 30;
|
|
||||||
default: return 31;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
- (int) absoluteGregorianDay: (int)day month: (int)month year: (int)year
|
- (int) absoluteGregorianDay: (int)day month: (int)month year: (int)year
|
||||||
{
|
{
|
||||||
int m, N;
|
return absoluteGregorianDay(day, month, year);
|
||||||
|
|
||||||
N = day; // day of month
|
|
||||||
for (m = month - 1; m > 0; m--) // days in prior months this year
|
|
||||||
N = N + [self lastDayOfGregorianMonth: m year: year];
|
|
||||||
return
|
|
||||||
(N // days this year
|
|
||||||
+ 365 * (year - 1) // days in previous years ignoring leap days
|
|
||||||
+ (year - 1)/4 // Julian leap days before this year...
|
|
||||||
- (year - 1)/100 // ...minus prior century years...
|
|
||||||
+ (year - 1)/400); // ...plus prior years divisible by 400
|
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void) gregorianDateFromAbsolute: (int)d
|
- (void) gregorianDateFromAbsolute: (int)d
|
||||||
|
@ -1277,15 +1302,14 @@
|
||||||
{
|
{
|
||||||
// Search forward year by year from approximate year
|
// Search forward year by year from approximate year
|
||||||
*year = d/366;
|
*year = d/366;
|
||||||
while (d >= [self absoluteGregorianDay: 1 month: 1 year: (*year)+1])
|
while (d >= absoluteGregorianDay(1, 1, (*year)+1))
|
||||||
(*year)++;
|
(*year)++;
|
||||||
// Search forward month by month from January
|
// Search forward month by month from January
|
||||||
(*month) = 1;
|
(*month) = 1;
|
||||||
while (d > [self absoluteGregorianDay:
|
while (d > absoluteGregorianDay(lastDayOfGregorianMonth(*month, *year),
|
||||||
[self lastDayOfGregorianMonth: *month year: *year]
|
*month, *year))
|
||||||
month: *month year: *year])
|
|
||||||
(*month)++;
|
(*month)++;
|
||||||
*day = d - [self absoluteGregorianDay: 1 month: *month year: *year] + 1;
|
*day = d - absoluteGregorianDay(1, *month, *year) + 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@end
|
@end
|
||||||
|
@ -1489,7 +1513,7 @@
|
||||||
tmpmonth += 12;
|
tmpmonth += 12;
|
||||||
tmpyear--;
|
tmpyear--;
|
||||||
}
|
}
|
||||||
extra += [end lastDayOfGregorianMonth: tmpmonth year: tmpyear];
|
extra += lastDayOfGregorianMonth(tmpmonth, tmpyear);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
108
Source/NSData.m
108
Source/NSData.m
|
@ -119,9 +119,11 @@ readContentsOfFile(NSString* path, void** buf, unsigned* len, NSZone* zone)
|
||||||
unsigned fileLength;
|
unsigned fileLength;
|
||||||
void *tmp = 0;
|
void *tmp = 0;
|
||||||
int c;
|
int c;
|
||||||
|
|
||||||
#if defined(__MINGW__)
|
#if defined(__MINGW__)
|
||||||
return NO;
|
HANDLE fh;
|
||||||
|
DWORD fileLength
|
||||||
|
DWORD high;
|
||||||
|
DWORD got;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if ([path getFileSystemRepresentation: thePath
|
if ([path getFileSystemRepresentation: thePath
|
||||||
|
@ -130,6 +132,65 @@ readContentsOfFile(NSString* path, void** buf, unsigned* len, NSZone* zone)
|
||||||
NSDebugLog(@"Open (%s) attempt failed - bad path", thePath);
|
NSDebugLog(@"Open (%s) attempt failed - bad path", thePath);
|
||||||
return NO;
|
return NO;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if defined(__MINGW__)
|
||||||
|
fh = CreateFile(thePath, GENERIC_READ, FILE_SHARE_READ, 0, OPEN_EXISTING,
|
||||||
|
FILE_ATTRIBUTE_NORMAL, 0);
|
||||||
|
if (fh == INVALID_HANDLE_VALUE)
|
||||||
|
{
|
||||||
|
NSDebugLog(@"Open (%s) attempt failed", thePath);
|
||||||
|
return NO;
|
||||||
|
}
|
||||||
|
|
||||||
|
fileLength = GetFileSize(fh, &high);
|
||||||
|
if ((fileLength == 0xFFFFFFFF) && (GetLastError() != NO_ERROR))
|
||||||
|
{
|
||||||
|
CloseHandle(fh);
|
||||||
|
NSLog(@"Failed to determine size of - %s", thePath);
|
||||||
|
return NO;
|
||||||
|
}
|
||||||
|
if (high != 0)
|
||||||
|
{
|
||||||
|
CloseHandle(fh);
|
||||||
|
NSLog(@"File too big to handle - %s", thePath);
|
||||||
|
return NO;
|
||||||
|
}
|
||||||
|
|
||||||
|
#if GS_WITH_GC == 1
|
||||||
|
tmp = NSZoneMalloc(GSAtomicMallocZone(), fileLength);
|
||||||
|
#else
|
||||||
|
tmp = NSZoneMalloc(zone, fileLength);
|
||||||
|
#endif
|
||||||
|
if (tmp == 0)
|
||||||
|
{
|
||||||
|
CloseHandle(fh);
|
||||||
|
NSLog(@"Malloc failed for file (%s) of length %d - %s",
|
||||||
|
thePath, fileLength, strerror(errno));
|
||||||
|
return NO;
|
||||||
|
}
|
||||||
|
if (!ReadFile(fh, tmp, fileSize, &got, 0))
|
||||||
|
{
|
||||||
|
if (tmp != 0)
|
||||||
|
{
|
||||||
|
NSZoneFree(zone, tmp);
|
||||||
|
CloseHandle(fh);
|
||||||
|
NSLog(@"File read operation failed for %s", thePath);
|
||||||
|
return NO;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (got != fileSize)
|
||||||
|
{
|
||||||
|
NSZoneFree(zone, tmp);
|
||||||
|
CloseHandle(fh);
|
||||||
|
NSLog(@"File read operation short for %s", thePath);
|
||||||
|
return NO;
|
||||||
|
}
|
||||||
|
CloseHandle(fh);
|
||||||
|
*buf = tmp;
|
||||||
|
*len = fileLength;
|
||||||
|
return YES;
|
||||||
|
#endif
|
||||||
|
|
||||||
theFile = fopen(thePath, "rb");
|
theFile = fopen(thePath, "rb");
|
||||||
|
|
||||||
if (theFile == NULL) /* We failed to open the file. */
|
if (theFile == NULL) /* We failed to open the file. */
|
||||||
|
@ -198,9 +259,9 @@ readContentsOfFile(NSString* path, void** buf, unsigned* len, NSZone* zone)
|
||||||
* Just in case the failure action needs to be changed.
|
* Just in case the failure action needs to be changed.
|
||||||
*/
|
*/
|
||||||
failure:
|
failure:
|
||||||
if (tmp)
|
if (tmp != 0)
|
||||||
NSZoneFree(zone, tmp);
|
NSZoneFree(zone, tmp);
|
||||||
if (theFile)
|
if (theFile != 0)
|
||||||
fclose(theFile);
|
fclose(theFile);
|
||||||
return NO;
|
return NO;
|
||||||
}
|
}
|
||||||
|
@ -535,10 +596,6 @@ failure:
|
||||||
FILE *theFile;
|
FILE *theFile;
|
||||||
int c;
|
int c;
|
||||||
|
|
||||||
#if defined(__MINGW__)
|
|
||||||
return NO;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if ([path getFileSystemRepresentation: theRealPath
|
if ([path getFileSystemRepresentation: theRealPath
|
||||||
maxLength: sizeof(theRealPath)-1] == NO)
|
maxLength: sizeof(theRealPath)-1] == NO)
|
||||||
{
|
{
|
||||||
|
@ -546,6 +603,38 @@ failure:
|
||||||
return NO;
|
return NO;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if defined(__MINGW__)
|
||||||
|
HANDLE fh;
|
||||||
|
DWORD wroteBytes;
|
||||||
|
|
||||||
|
if (useAuxiliaryFile)
|
||||||
|
{
|
||||||
|
path = [path stringByAppendingPathExtension: @"tmp"];
|
||||||
|
}
|
||||||
|
if ([path getFileSystemRepresentation: thePath
|
||||||
|
maxLength: sizeof(thePath)-1] == NO)
|
||||||
|
{
|
||||||
|
NSDebugLog(@"Open (%s) attempt failed - bad path", thePath);
|
||||||
|
return NO;
|
||||||
|
}
|
||||||
|
|
||||||
|
fh = CreateFile(thePath, GENERIC_WRITE, 0, 0, CREATE_ALWAYS,
|
||||||
|
FILE_ATTRIBUTE_NORMAL, NULL);
|
||||||
|
if (fh == INVALID_HANDLE_VALUE)
|
||||||
|
{
|
||||||
|
NSLog(@"Create (%s) attempt failed", thePath);
|
||||||
|
return NO;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!WriteFile(fh, [self bytes], [self length], &wroteBytes, 0))
|
||||||
|
{
|
||||||
|
CloseHandle(fh);
|
||||||
|
NSLog(@"Write (%s) attempt failed", thePath);
|
||||||
|
goto failure;
|
||||||
|
}
|
||||||
|
CloseHandle(fh);
|
||||||
|
#else
|
||||||
|
|
||||||
#ifdef HAVE_MKSTEMP
|
#ifdef HAVE_MKSTEMP
|
||||||
if (useAuxiliaryFile)
|
if (useAuxiliaryFile)
|
||||||
{
|
{
|
||||||
|
@ -620,6 +709,7 @@ failure:
|
||||||
NSLog(@"Fclose (%s) failed - %s", thePath, strerror(errno));
|
NSLog(@"Fclose (%s) failed - %s", thePath, strerror(errno));
|
||||||
goto failure;
|
goto failure;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
/* If we used a temporary file, we still need to rename() it be the
|
/* If we used a temporary file, we still need to rename() it be the
|
||||||
* real file. Also, we need to try to retain the file attributes of
|
* real file. Also, we need to try to retain the file attributes of
|
||||||
|
@ -673,7 +763,7 @@ failure:
|
||||||
return YES;
|
return YES;
|
||||||
|
|
||||||
/* Just in case the failure action needs to be changed. */
|
/* Just in case the failure action needs to be changed. */
|
||||||
failure:
|
failure:
|
||||||
/*
|
/*
|
||||||
* Attempt to tidy up by removing temporary file on failure.
|
* Attempt to tidy up by removing temporary file on failure.
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -119,8 +119,9 @@ GSTimeNow()
|
||||||
return interval;
|
return interval;
|
||||||
#else
|
#else
|
||||||
SYSTEMTIME sys_time;
|
SYSTEMTIME sys_time;
|
||||||
NSCalendarDate *d;
|
|
||||||
NSTimeInterval t;
|
NSTimeInterval t;
|
||||||
|
#if 0
|
||||||
|
NSCalendarDate *d;
|
||||||
|
|
||||||
// Get the system time
|
// Get the system time
|
||||||
GetLocalTime(&sys_time);
|
GetLocalTime(&sys_time);
|
||||||
|
@ -136,6 +137,14 @@ GSTimeNow()
|
||||||
timeZone: [NSTimeZone localTimeZone]];
|
timeZone: [NSTimeZone localTimeZone]];
|
||||||
t = otherTime(d);
|
t = otherTime(d);
|
||||||
RELEASE(d);
|
RELEASE(d);
|
||||||
|
#else
|
||||||
|
/*
|
||||||
|
* Get current GMT time, convert to NSTimeInterval since reference date,
|
||||||
|
*/
|
||||||
|
GetSystemTime(&sys_time);
|
||||||
|
t = GSTime(sys_time.eDay, sys_time.wMonth, sys_time.wYear,
|
||||||
|
sys_time.wHour, sys_time.wMinute, sys_time.wSecond);
|
||||||
|
#endif
|
||||||
return t + sys_time.wMilliseconds / 1000.0;
|
return t + sys_time.wMilliseconds / 1000.0;
|
||||||
#endif /* __MINGW__ */
|
#endif /* __MINGW__ */
|
||||||
}
|
}
|
||||||
|
|
|
@ -515,7 +515,13 @@ static NSFileManager* defaultManager = nil;
|
||||||
contents = [self directoryContentsAtPath: path];
|
contents = [self directoryContentsAtPath: path];
|
||||||
if (contents == nil)
|
if (contents == nil)
|
||||||
{
|
{
|
||||||
if (unlink([path fileSystemRepresentation]) < 0)
|
const char *cpath = [path fileSystemRepresentation];
|
||||||
|
|
||||||
|
#if defined(__MINGW__)
|
||||||
|
if (DeleteFile(cpath) == FALSE)
|
||||||
|
#else
|
||||||
|
if (unlink(cpath) < 0)
|
||||||
|
#endif
|
||||||
{
|
{
|
||||||
BOOL result;
|
BOOL result;
|
||||||
|
|
||||||
|
@ -587,14 +593,43 @@ static NSFileManager* defaultManager = nil;
|
||||||
contents: (NSData*)contents
|
contents: (NSData*)contents
|
||||||
attributes: (NSDictionary*)attributes
|
attributes: (NSDictionary*)attributes
|
||||||
{
|
{
|
||||||
int fd, len, written;
|
int len;
|
||||||
|
int written;
|
||||||
|
const char *cpath = [self fileSystemRepresentationWithPath: path];
|
||||||
|
|
||||||
fd = open ([self fileSystemRepresentationWithPath: path],
|
#if defined(__MINGW__)
|
||||||
O_WRONLY|O_TRUNC|O_CREAT, 0644);
|
HANDLE fh;
|
||||||
|
|
||||||
|
fh = CreateFile(cpath, GENERIC_WRITE, 0, 0, CREATE_ALWAYS,
|
||||||
|
FILE_ATTRIBUTE_NORMAL, 0);
|
||||||
|
if (fh == INVALID_HANDLE_VALUE)
|
||||||
|
{
|
||||||
|
return NO;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
DWORD len = [contents length];
|
||||||
|
DWORD written = 0;
|
||||||
|
|
||||||
|
if (len > 0)
|
||||||
|
{
|
||||||
|
WriteFile(fh, [contents bytes], len, &written, NULL);
|
||||||
|
}
|
||||||
|
CloseHandle(fh);
|
||||||
|
if ([self changeFileAttributes: attributes atPath: path] == NO)
|
||||||
|
{
|
||||||
|
return NO;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
int fd;
|
||||||
|
|
||||||
|
fd = open (cpath, O_WRONLY|O_TRUNC|O_CREAT, 0644);
|
||||||
if (fd < 0)
|
if (fd < 0)
|
||||||
return NO;
|
{
|
||||||
|
return NO;
|
||||||
if (![self changeFileAttributes: attributes atPath: path])
|
}
|
||||||
|
if ([self changeFileAttributes: attributes atPath: path] == NO)
|
||||||
{
|
{
|
||||||
close (fd);
|
close (fd);
|
||||||
return NO;
|
return NO;
|
||||||
|
@ -618,12 +653,16 @@ static NSFileManager* defaultManager = nil;
|
||||||
}
|
}
|
||||||
|
|
||||||
len = [contents length];
|
len = [contents length];
|
||||||
if (len)
|
if (len > 0)
|
||||||
written = write (fd, [contents bytes], len);
|
{
|
||||||
|
written = write(fd, [contents bytes], len);
|
||||||
|
}
|
||||||
else
|
else
|
||||||
written = 0;
|
{
|
||||||
|
written = 0;
|
||||||
|
}
|
||||||
close (fd);
|
close (fd);
|
||||||
|
#endif
|
||||||
return written == len;
|
return written == len;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue