Native Client(NaCl)をやってみる (8) - pp::FileSystem -
タイトル通り、今まで同様にサンプル(今回はfile_io)にあるソースを読んでやってみてる。File IOなAPIを使ってストレージサービス(Webサービスでは無い)なところにデータを読み書きしてみる
sample.cc
#include <iostream>
#include <sstream>
#include <time.h>
#include "ppapi/c/ppb_file_io.h"
#include "ppapi/cpp/instance.h"
#include "ppapi/cpp/module.h"
#include "ppapi/cpp/file_system.h"
#include "ppapi/cpp/file_ref.h"
#include "ppapi/cpp/file_io.h"
#include "ppapi/utility/completion_callback_factory.h"
using namespace std;
const string filename = "/sample.txt";
class SampleInstance : public pp::Instance {
public:
explicit SampleInstance(PP_Instance instance) :
pp::Instance(instance),
fs_(this, PP_FILESYSTEMTYPE_LOCALPERSISTENT),
factory_(this) {
}
virtual bool Init(uint32_t argc, const char* argn[], const char* argv[]) {
pp::CompletionCallback callback = factory_.NewCallback(
&SampleInstance::OnFileSystemOpen
);
int32_t rv = fs_.Open(1024 * 1024, callback);
if (rv != PP_OK_COMPLETIONPENDING) {
callback.Run(rv);
return false;
}
return true;
}
virtual void HandleMessage(const pp::Var& message) {
string s = message.AsString();
if (s.compare("load") == 0) {
Load();
} else if (s.compare("save") == 0) {
Save();
} else {
PostMessage("Unknown Command");
}
}
private:
pp::FileSystem fs_;
pp::CompletionCallbackFactory<SampleInstance> factory_;
struct RequestFileInfo {
pp::FileIO file;
pp::FileRef ref;
PP_FileInfo stat;
string data;
};
long getTime() {
time_t timer;
time(&timer);
long t = timer;
return t;
}
void OnFileSystemOpen(int32_t result) {
if (result != PP_OK) {
return;
}
PostMessage("OnFileSystemOpen");
}
void Load() {
SampleInstance::RequestFileInfo* info;
info = new SampleInstance::RequestFileInfo();
info->file = pp::FileIO(this);
info->ref = pp::FileRef(fs_, filename.c_str());
pp::CompletionCallback callback = factory_.NewCallback(
&SampleInstance::OnLoad,
info
);
int32_t rv = info->file.Open(info->ref, PP_FILEOPENFLAG_READ, callback);
if (rv != PP_OK_COMPLETIONPENDING) {
callback.Run(rv);
}
PostMessage("Load");
}
void OnLoad(int32_t result, SampleInstance::RequestFileInfo* info) {
if (result != PP_OK) {
if (result == PP_ERROR_FILENOTFOUND) {
PostMessage("404");
}
delete info;
return;
}
pp::CompletionCallback callback = factory_.NewCallback(
&SampleInstance::OnQuery,
info
);
int32_t rv = info->file.Query(&info->stat, callback);
if (rv != PP_OK_COMPLETIONPENDING) {
callback.Run(rv);
}
PostMessage("OnLoad");
}
void OnQuery(int32_t result, SampleInstance::RequestFileInfo* info) {
if (result != PP_OK) {
delete info;
return;
}
info->data.resize(info->stat.size, "