#include <iostream>
#include <string>
#include <fstream>
#include <sstream>
#include <vector>
#include "sdisk.h"
using namespace std;
Sdisk::Sdisk(string diskName, int numberOfBlocks, int blockSize) {
fstream infile;
infile.open(diskName.c_str());
if (!infile.good()) {
cout << "No disk found. Creating disk \"" << diskName << "\"" << endl;
ofstream outfile;
outfile.open(diskName.c_str());
this->diskName = diskName;
this->numberOfBlocks = numberOfBlocks;
this->blockSize = blockSize;
string buffer;
ostringstream outstream;
for (int i = 0; i <= numberOfBlocks * blockSize; i++) {
outstream << "#";
}
buffer = outstream.str();
vector<string> blocks = block(buffer, getBlockSize());
for (int i = 0; i < numberOfBlocks; i++) {
putBlock(i, blocks[i]);
}
outfile.close();
cout << "Disk \"" << diskName << "\" created." << endl;
}
else {
cout << "Disk \"" << diskName << "\" found." << endl;
this->diskName = diskName;
this->numberOfBlocks = numberOfBlocks;
this->blockSize = blockSize;
}
infile.close();
return;
}
int Sdisk::getBlock(int blockNumber, string& buffer) {
fstream iofile;
string tbuffer;
iofile.open(diskName.c_str(), ios::in | ios::out);
iofile.seekg(blockNumber * blockSize);
char c;
for (int i = 0; i < blockSize; i++) {
c = iofile.get();
tbuffer.push_back(c);
}
buffer = tbuffer;
iofile.close();
return 1;
}
int Sdisk::putBlock(int blockNumber, string buffer) {
fstream iofile;
iofile.open(diskName.c_str(), ios::in | ios::out);
iofile.seekp(blockNumber * blockSize);
for (string::iterator it = buffer.begin(); it < buffer.end(); it++) {
iofile.put(*it);
}
iofile.close();
return 1;
}
vector<string> Sdisk::block(string buffer, int b) {
// blocks the buffer into a list of blocks of size b
vector<string> blocks;
size_t numberofblocks = 0;
if (buffer.length() % b == 0) {
numberofblocks = buffer.length() / b;
}
else {
numberofblocks = buffer.length() / b + 1;
}
string tempblock;
for (int i=0; i<numberofblocks; i++) {
tempblock = buffer.substr(b * i, b);
blocks.push_back(tempblock);
}
size_t lastblock = blocks.size() - 1;
for (size_t i = blocks[lastblock].length(); i < b; i++) {
blocks[lastblock] += "#";
}
return blocks;
}
int Sdisk::getNumberOfBlocks() {
return numberOfBlocks;
}
int Sdisk::getBlockSize() {
return blockSize;
}
string Sdisk::getDiskName() {
return diskName;
}