12 const char * query_str="QUERY_STRING";
13 const char * uri_str="REQUEST_URI";
14 const char * method_str="REQUEST_METHOD";
15 const char * iotcloudroot_str="IOTCLOUD_ROOT";
16 const char * length_str="CONTENT_LENGTH";
18 IoTQuery::IoTQuery(FCGX_Request *request) :
30 requestsequencenumber(0),
31 numqueueentries(DEFAULT_SIZE),
36 IoTQuery::~IoTQuery() {
47 bool IoTQuery::checkDirectory() {
49 int err=stat(directory, &s);
52 return S_ISDIR(s.st_mode);
55 void IoTQuery::decodeQuery() {
56 int len=strlen(query);
57 char * str=new char[len+1];
58 memcpy(str, query, len+1);
62 char *command=strsep(&tok_ptr, "&");
63 if (strncmp(command, "putslot", 7) == 0)
66 if (strncmp(command, "getslot", 7) == 0)
69 /* Load Sequence Number for request */
70 char *sequencenumber_str = strsep(&tok_ptr, "&");
72 if (sequencenumber_str != NULL)
73 requestsequencenumber = strtol(sequencenumber_str, NULL, 10);
75 /* Update size if we get request */
76 char * numqueueentries_str = tok_ptr;
77 if (numqueueentries_str != NULL)
78 numqueueentries = strtol(numqueueentries_str, NULL, 10);
83 void IoTQuery::getSlot() {
87 void IoTQuery::putSlot() {
91 void IoTQuery::processQuery() {
96 if (strncmp(method, "POST", 4) != 0)
99 if (directory == NULL ||
103 if (!openStatusFile())
117 void IoTQuery::readData() {
119 data = new char[length+1];
120 memset(data, 0, length+1);
121 cin.read(data, length);
126 } while (!cin.eof());
129 void IoTQuery::getQuery() {
130 uri = FCGX_GetParam(uri_str, request->envp);
131 query = FCGX_GetParam(query_str, request->envp);
132 method = FCGX_GetParam(method_str, request->envp);
133 iotcloudroot = FCGX_GetParam(iotcloudroot_str, request->envp);
135 char * reqlength = FCGX_GetParam(length_str, request->envp);
137 length=strtol(reqlength, NULL, 10);
143 void IoTQuery::getDirectory() {
144 char * split = strchr((char *)uri, '?');
147 int split_len = (int) (split-uri);
148 int rootdir_len = strlen(iotcloudroot);
149 int directory_len = split_len + rootdir_len + 1;
150 directory = new char[directory_len];
151 memcpy(directory, iotcloudroot, rootdir_len);
152 memcpy(directory + rootdir_len, uri, split_len);
153 directory[directory_len]=0;
156 int doread(int fd, void *ptr, size_t count, off_t offset) {
158 size_t bytesread=pread(fd, ptr, count, offset);
159 if (bytesread==count) {
161 } else if (bytesread==0) {
167 void IoTQuery::updateStatusFile() {
168 pwrite(fd, &numqueueentries, sizeof(numqueueentries), OFFSET_MAX);
169 pwrite(fd, &firstentry, sizeof(firstentry), OFFSET_FIRST);
170 pwrite(fd, &lastentry, sizeof(lastentry), OFFSET_LAST);
173 bool IoTQuery::openStatusFile() {
174 char statusfile[]="queuestatus";
175 int len=strlen(directory);
177 char * filename=new char[len+sizeof(statusfile)+2];
178 memcpy(filename, directory, len);
180 memcpy(filename+len+1, statusfile, sizeof(statusfile));
181 filename[len+sizeof(statusfile)+1]=0;
182 fd=open(filename, O_CREAT| O_RDWR, S_IRUSR| S_IWUSR);
190 if (doread(fd, &size, sizeof(size), OFFSET_MAX))
191 numqueueentries=size;
196 if (doread(fd, &entry, sizeof(entry), OFFSET_FIRST))
201 if (doread(fd, &entry, sizeof(entry), OFFSET_LAST))