diff options
-rw-r--r-- | dumb_render.f90 | 21 | ||||
-rw-r--r-- | main.F90 | 24 | ||||
-rw-r--r-- | protocol.f90 | 44 | ||||
-rw-r--r-- | render.f90 | 34 |
4 files changed, 113 insertions, 10 deletions
diff --git a/dumb_render.f90 b/dumb_render.f90 index 7ff4e6d..c3b49a1 100644 --- a/dumb_render.f90 +++ b/dumb_render.f90 @@ -44,6 +44,8 @@ implicit none procedure :: request_action => dumb_action + procedure :: request_save_filename => dumb_request_save_filename + end type dumb_renderer contains @@ -309,8 +311,25 @@ contains end if end if - end function dumb_action + function dumb_request_save_filename(self, url, mimetype, filename) + implicit none + + class(dumb_renderer)::self + character(*), intent(in)::url + character(*), intent(in)::mimetype + character(*), intent(out)::filename + logical::dumb_request_save_filename + + Print *, "*** Response type is "//trim(mimetype) + Write(*, '(1X, A26)', advance='no') "*** Save file as: " + + Read(*, *) filename + + dumb_request_save_filename = (len_trim(filename) > 0) + + end function dumb_request_save_filename + end module dumb_render
\ No newline at end of file @@ -22,6 +22,7 @@ implicit none logical::populated integer::return_code + character(256)::return_type integer, parameter::io = 100 @@ -77,7 +78,7 @@ implicit none call r%report_status("Requesting "//trim(current_url)) - return_code = request_url(current_url, io) + return_code = request_url(current_url, io, return_type) populated = .true. call update_status(r, current_url, return_code) @@ -103,12 +104,21 @@ implicit none locations_visited => add_location(locations_visited, current_url) - first_line => load_unit(io, file_type_gemini) - loaded = .true. - call r%new_page() - call r%report_status("Performing Layout") - call layout_lines(first_line, r) - + if(r%type_supported(return_type)) then + + first_line => load_unit(io, file_type_gemini) + loaded = .true. + call r%new_page() + call r%report_status("Performing Layout") + call layout_lines(first_line, r) + + else + + call r%draw_error("Cannot display file of type "//return_type) + call back_location(locations_visited, current_url) + + end if + end if do while(loaded .and. running) diff --git a/protocol.f90 b/protocol.f90 index 76fb8d4..194e0e7 100644 --- a/protocol.f90 +++ b/protocol.f90 @@ -14,7 +14,44 @@ implicit none contains - function request_url(url, unit_number, server_name) result(returncode) + subroutine read_mimetype(unit_number, return_type) + implicit none + integer, intent(in)::unit_number + character(*), intent(out)::return_type + + character::c + integer::iostatus, i + + return_type = " " + + ! Advance past status and space + read(unit_number, '(A1)', advance='no', iostat=iostatus) c + do while(c /= " " .and. c /= char(9) .and. iostatus == 0) + read(unit_number, '(A1)', advance='no', iostat=iostatus) c + end do + do while((c == " " .or. c == char(9)) .and. iostatus == 0) + read(unit_number, '(A1)', advance='no', iostat=iostatus) c + end do + + if(iostatus == 0) then + ! c now contains the first entry of the mimetype + i = 0 + do while(iostatus == 0) + i = i + 1 + return_type(i:i) = c + read(unit_number, '(A1)', advance='no', iostat=iostatus) c + end do + + end if + + ! Default + if(len_trim(return_type) == 0) then + return_type = "text/gemini" + end if + + end subroutine read_mimetype + + function request_url(url, unit_number, return_type, server_name) result(returncode) use request use iso_c_binding use file_handling, only: mark_file_end @@ -22,6 +59,7 @@ contains character(*), intent(inout)::url integer, intent(in)::unit_number + character(*), intent(out)::return_type character(*), intent(in), optional::server_name integer::returncode @@ -64,9 +102,11 @@ contains call mark_file_end(unit_number) rewind(unit_number) - read(unit_number, '(I1)', iostat=iostatus) returncode + read(unit_number, '(I1)', iostat=iostatus, advance='no') returncode if(iostatus /= 0) then returncode = STATUS_BADRESPONSE + else + call read_mimetype(unit_number, return_type) end if else @@ -7,6 +7,10 @@ implicit none integer, parameter::render_action_back = 4 integer, parameter::render_action_quit = 5 + character(11), dimension(2)::base_supported_types = & + ["text/plain ", & + "text/gemini" ] + type, abstract :: renderer integer::y @@ -15,6 +19,7 @@ implicit none contains procedure::render_proportional + procedure::type_supported procedure(initialize), deferred::initialize procedure(prepare_for_layout), deferred::prepare_for_layout @@ -128,8 +133,37 @@ implicit none end function request_action end interface + abstract interface + function request_save_filename(self, url, mimetype, filename) + import::renderer + class(renderer)::self + character(*), intent(in)::url + character(*), intent(in)::mimetype + character(*), intent(out)::filename + logical::request_save_filename + end function request_save_filename + end interface + contains + function type_supported(self, mimetype) + implicit none + + class(renderer)::self + character(*), intent(in)::mimetype + logical::type_supported + integer::i + + type_supported = .false. + do i = 1, size(base_supported_types) + if(trim(mimetype) == trim(base_supported_types(i))) then + type_supported = .true. + exit + end if + end do + + end function type_supported + function width_of_line(r, text, startpos, endpos) implicit none |