52230ca22b
The native ports use the snapshot reader to create the dart objects. Added support for reading external arrays from snapshots but no support for writing them. The only way an external array is written to a snapshot is through the api message writer. This allows dart:io to avoid one copy of data read from files and sockets. This change only contains one use of the new API. R=asiva@google.com,iposva@google.com BUG= TEST= Review URL: https://chromiumcodereview.appspot.com//10698011 git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart@9281 260f80e4-7a28-3924-810f-c04153c831b5
160 lines
4.4 KiB
C++
160 lines
4.4 KiB
C++
// Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file
|
|
// for details. All rights reserved. Use of this source code is governed by a
|
|
// BSD-style license that can be found in the LICENSE file.
|
|
|
|
#ifndef BIN_FILE_H_
|
|
#define BIN_FILE_H_
|
|
|
|
#if defined(_WIN32)
|
|
typedef signed __int64 int64_t;
|
|
typedef unsigned __int8 uint8_t;
|
|
#else
|
|
#include <stdint.h>
|
|
#endif
|
|
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
#include <stdio.h>
|
|
#include <sys/types.h>
|
|
|
|
#include "bin/builtin.h"
|
|
#include "bin/dartutils.h"
|
|
#include "platform/globals.h"
|
|
#include "platform/thread.h"
|
|
|
|
// Forward declaration.
|
|
class FileHandle;
|
|
|
|
class File {
|
|
public:
|
|
enum FileOpenMode {
|
|
kRead = 0,
|
|
kWrite = 1,
|
|
kTruncate = 1 << 2,
|
|
kWriteTruncate = kWrite | kTruncate
|
|
};
|
|
|
|
// These values have to be kept in sync with the mode values of
|
|
// FileMode.READ, FileMode.WRITE and FileMode.APPEND in file.dart.
|
|
enum DartFileOpenMode {
|
|
kDartRead = 0,
|
|
kDartWrite = 1,
|
|
kDartAppend = 2
|
|
};
|
|
|
|
enum StdioHandleType {
|
|
kTerminal = 0,
|
|
kPipe = 1,
|
|
kFile = 2,
|
|
kSocket = 3,
|
|
kOther = -1
|
|
};
|
|
|
|
enum FileRequest {
|
|
kExistsRequest = 0,
|
|
kCreateRequest = 1,
|
|
kDeleteRequest = 2,
|
|
kOpenRequest = 3,
|
|
kFullPathRequest = 4,
|
|
kDirectoryRequest = 5,
|
|
kCloseRequest = 6,
|
|
kPositionRequest = 7,
|
|
kSetPositionRequest = 8,
|
|
kTruncateRequest = 9,
|
|
kLengthRequest = 10,
|
|
kLengthFromNameRequest = 11,
|
|
kLastModifiedRequest = 12,
|
|
kFlushRequest = 13,
|
|
kReadByteRequest = 14,
|
|
kWriteByteRequest = 15,
|
|
kReadListRequest = 16,
|
|
kWriteListRequest = 17,
|
|
kWriteStringRequest = 18
|
|
};
|
|
|
|
~File();
|
|
|
|
// Read/Write attempt to transfer num_bytes to/from buffer. It returns
|
|
// the number of bytes read/written.
|
|
int64_t Read(void* buffer, int64_t num_bytes);
|
|
int64_t Write(const void* buffer, int64_t num_bytes);
|
|
|
|
// ReadFully and WriteFully do attempt to transfer num_bytes to/from
|
|
// the buffer. In the event of short accesses they will loop internally until
|
|
// the whole buffer has been transferred or an error occurs. If an error
|
|
// occurred the result will be set to false.
|
|
bool ReadFully(void* buffer, int64_t num_bytes);
|
|
bool WriteFully(const void* buffer, int64_t num_bytes);
|
|
bool WriteByte(uint8_t byte) {
|
|
return WriteFully(&byte, 1);
|
|
}
|
|
|
|
// Get the length of the file. Returns a negative value if the length cannot
|
|
// be determined (e.g. not seekable device).
|
|
off_t Length();
|
|
|
|
// Get the current position in the file.
|
|
// Returns a negative value if position cannot be determined.
|
|
off_t Position();
|
|
|
|
// Set the byte position in the file.
|
|
bool SetPosition(int64_t position);
|
|
|
|
// Truncate (or extend) the file to the given length in bytes.
|
|
bool Truncate(int64_t length);
|
|
|
|
// Flush contents of file.
|
|
bool Flush();
|
|
|
|
// Returns whether the file has been closed.
|
|
bool IsClosed();
|
|
|
|
const char* name() const { return name_; }
|
|
|
|
// Open the file with the given name. The file is always opened for
|
|
// reading. If mode contains kWrite the file is opened for both
|
|
// reading and writing. If mode contains kWrite and the file does
|
|
// not exist the file is created. The file is truncated to length 0 if
|
|
// mode contains kTruncate.
|
|
static File* Open(const char* name, FileOpenMode mode);
|
|
|
|
// Create a file object for the specified stdio file descriptor
|
|
// (stdin, stout or stderr).
|
|
static File* OpenStdio(int fd);
|
|
|
|
static bool Exists(const char* name);
|
|
static bool Create(const char* name);
|
|
static bool Delete(const char* name);
|
|
static off_t LengthFromName(const char* name);
|
|
static time_t LastModified(const char* name);
|
|
static bool IsAbsolutePath(const char* pathname);
|
|
static char* GetCanonicalPath(const char* name);
|
|
static char* GetContainingDirectory(char* name);
|
|
static const char* PathSeparator();
|
|
static const char* StringEscapedPathSeparator();
|
|
static StdioHandleType GetStdioHandleType(int fd);
|
|
|
|
static FileOpenMode DartModeToFileMode(DartFileOpenMode mode);
|
|
|
|
static Dart_Port GetServicePort();
|
|
|
|
private:
|
|
File(const char* name, FileHandle* handle) : name_(name), handle_(handle) { }
|
|
void Close();
|
|
|
|
static const int kClosedFd = -1;
|
|
|
|
const char* name_;
|
|
// FileHandle is an OS specific class which stores data about the file.
|
|
FileHandle* handle_; // OS specific handle for the file.
|
|
|
|
static dart::Mutex mutex_;
|
|
static int service_ports_size_;
|
|
static Dart_Port* service_ports_;
|
|
static int service_ports_index_;
|
|
|
|
DISALLOW_COPY_AND_ASSIGN(File);
|
|
};
|
|
|
|
#endif // BIN_FILE_H_
|