+
+ if trace.inserted?
+ if trace.public? or (@user and @user == trace.user)
+ send_file(trace.icon_picture_name, :filename => "#{trace.id}_icon.gif", :type => 'image/gif', :disposition => 'inline')
+ else
+ render :nothing => true, :status => :forbidden
+ end
+ else
+ render :nothing => true, :status => :not_found
+ end
+ rescue ActiveRecord::RecordNotFound
+ render :nothing => true, :status => :not_found
+ end
+
+ def api_details
+ trace = Trace.find(params[:id])
+
+ if trace.public? or trace.user == @user
+ render :text => trace.to_xml.to_s, :content_type => "text/xml"
+ else
+ render :nothing => true, :status => :forbidden
+ end
+ rescue ActiveRecord::RecordNotFound
+ render :nothing => true, :status => :not_found
+ end
+
+ def api_data
+ trace = Trace.find(params[:id])
+
+ if trace.public? or trace.user == @user
+ send_file(trace.trace_name, :filename => "#{trace.id}#{trace.extension_name}", :type => trace.mime_type, :disposition => 'attachment')
+ else
+ render :nothing => true, :status => :forbidden
+ end
+ rescue ActiveRecord::RecordNotFound
+ render :nothing => true, :status => :not_found
+ end
+
+ def api_create
+ if request.post?
+ do_create(params[:file], params[:tags], params[:description], params[:public])
+
+ if @trace.id
+ render :text => @trace.id.to_s, :content_type => "text/plain"
+ elsif @trace.valid?
+ render :nothing => true, :status => :internal_server_error
+ else
+ render :nothing => true, :status => :bad_request
+ end
+ else
+ render :nothing => true, :status => :method_not_allowed
+ end
+ end
+
+private
+
+ def do_create(file, tags, description, public)
+ name = file.original_filename.gsub(/[^a-zA-Z0-9.]/, '_')
+ filename = "/tmp/#{rand}"
+
+ File.open(filename, "w") { |f| f.write(file.read) }
+
+ @trace = Trace.new({:name => name, :tagstring => tags,
+ :description => description, :public => public})
+ @trace.inserted = false
+ @trace.user = @user
+ @trace.timestamp = Time.now
+
+ if @trace.save
+ FileUtils.mv(filename, @trace.trace_name)
+ else
+ FileUtils.rm_f(filename)
+ end
+
+ # Finally save whether the user marked the trace as being public
+ if @trace.public?
+ if @user.trace_public_default.nil?
+ @user.preferences.create(:k => "gps.trace.public", :v => "default")
+ end
+ else
+ pref = @user.trace_public_default
+ pref.destroy unless pref.nil?
+ end
+