blob: 176f36d8e180dfefa42d16a43dad8279f33c712a [file] [log] [blame]
// Copyright 2013 The Goma Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef DEVTOOLS_GOMA_CLIENT_DESCRIPTOR_H_
#define DEVTOOLS_GOMA_CLIENT_DESCRIPTOR_H_
#include <memory>
#include <string>
#ifndef _WIN32
#include <unistd.h>
#else
#include "config_win.h"
#endif
#include "absl/time/time.h"
using std::string;
namespace devtools_goma {
class OneshotClosure;
class PermanentClosure;
class SocketDescriptor;
// Descriptor must be used on the same thread where it is created.
// All notification closure will be called on the same thread.
class Descriptor {
public:
// closure must be created by NewPermanentCallback.
// must not call this in notification closure itself.
virtual void NotifyWhenReadable(
std::unique_ptr<PermanentClosure> closure) = 0;
virtual void NotifyWhenWritable(
std::unique_ptr<PermanentClosure> closure) = 0;
virtual void ClearWritable() = 0;
// closure must be created by NewCallback, that is, one shot closure.
// must not call this in notification closure itself.
virtual void NotifyWhenTimedout(absl::Duration timeout,
OneshotClosure* closure) = 0;
virtual void ChangeTimeout(absl::Duration timeout) = 0;
// Read/Write returns following values:
// < 0: I/O error including retriable error.
// (A caller should retry Read/Write if NeedRetry is true)
// = 0: a connection is closed by a peer.
// > 0: number of bytes read/written.
// len must be > 0. because, if len == 0 and returns 0, it is not certain
// whether no data transferred or close detected.
virtual ssize_t Read(void* ptr, size_t len) = 0;
virtual ssize_t Write(const void* ptr, size_t len) = 0;
// NeedRetry is true when previous Read or Write is failed but
// a caller should retry Read or Write.
virtual bool NeedRetry() const = 0;
// CanReuse returns true if underlying socket can be reused.
virtual bool CanReuse() const = 0;
virtual string GetLastErrorMessage() const = 0;
// stop more notification.
// you can call this in notification closure.
virtual void StopRead() = 0;
virtual void StopWrite() = 0;
virtual SocketDescriptor* socket_descriptor() = 0;
protected:
Descriptor() {}
virtual ~Descriptor() {}
private:
DISALLOW_COPY_AND_ASSIGN(Descriptor);
};
} // namespace devtools_goma
#endif // DEVTOOLS_GOMA_CLIENT_DESCRIPTOR_H_